āļŠāļĢāļļāļāļŠāļąāđāļ āđ
āđāļāļĩāļĒāļ Go āļāđāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ SQL āđāļĄāđāļĢāļđāđāļāļ°āļāļąāļ GORM āđāļĄāđāđāļāđāđāļĨāđāļ§āļ§
āđāļāļĩāļĒāļāđāļāļĒ
Sirasit Boonklang (Aeff)
Tech and Coding Consultant
āļāļāļāļ§āļēāļĄāļāļĩāđāļāļĩāļāļīāļĄāļāđ āđāļĨāļ° āđāļāļĒāđāļāļĢāđāđāļĄāļ·āđāļ 9 āļāļĪāļĐāļ āļēāļāļĄ 2566
GORM āļāļ·āļāļāļ°āđāļĢ
GORM āļāļ·āļ Library āļāļāļ ORM āļŠāļģāļŦāļĢāļąāļāđāļāđāļāļēāļāđāļāļ āļēāļĐāļē Golang
āđāļĨāđāļ§āđāļāđāļē ORM āđāļāļĩāđāļĒāļāļ·āļāļāļ°āđāļĢāļāļĩāļ?
ORM āļāļ·āļ āđāļāļāļāļīāļāļāļĩāđāļāđāļ§āļĒāđāļŦāđāđāļĢāļēāļŠāļēāļĄāļēāļĢāļāđāļĄāļāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļ Relational Database āļāļąāļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļĄāļīāđāļāļāļĩāđāđāļāļĩāļĒāļāđāļāļ OOP āđāļāļĒāļāļ°āļāļģāđāļŦāđāđāļĢāļēāđāļĄāđāļāļģāđāļāđāļāļāđāļāļāđāļāļĩāļĒāļāļāļģāļŠāļąāđāļ SQL āđāļāļ āđāļāđāļāļ°āđāļāđāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāļđāļāđāļāļāļāļģāļŠāļąāđāļāļāļāļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļĄāļīāđāļāļāļąāđāļ āđ āđāļāđāđāļĨāļĒ āļāļģāđāļŦāđāļĨāļāļāļ§āļēāļĄāļāļąāļāļāđāļāļāļāļāļāļāļēāļĢāļāļīāļāļāđāļāļŦāļĢāļ·āļāļĄāļĩ Interact āļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ
āļāļĩāđāļāļāļĢāđāđāļāđāļ āđ āļāļāļāđāļāđāļē GORM
1. Associations: GORM āļĢāļāļāļĢāļąāļāļāļēāļĢāđāļāļ·āđāļāļĄāđāļĒāļāļāļĢāļ°āđāļ āļāļāđāļēāļ āđ āđāļāđāļ has one, have many, belongs to, many to many, polymorphism āđāļĨāļ° single-table inheritance āļŠāļīāđāļāļāļĩāđāļāļģāđāļŦāđāļāļļāļāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāđāļĨāļ°āļāļąāļāļāļēāļĢāļāļ§āļēāļĄāļŠāļąāļĄāļāļąāļāļāđāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļēāļāļāļēāļāļāđāļāļĄāļđāļĨāļāđāļēāļ āđ āđāļāđāļāļĒāđāļēāļāļāđāļēāļĒāļāļēāļĒ
2. Hooks: GORM āļāļąāļāđāļāļĢāļĩāļĒāļĄ hooks āļŠāļģāļŦāļĢāļąāļ āļāđāļāļāđāļĨāļ°āļŦāļĨāļąāļ Create/Save/Update/Delete/Find operation āļāļģāđāļŦāđāļāļļāļāļŠāļēāļĄāļēāļĢāļ custom logic āđāļāđ
3.Eager loading: GORM āļĢāļāļāļĢāļąāļ eager loading āđāļāļĒāđāļāđ Method Preload āđāļĨāļ° Joins āļāļģāđāļŦāđāļĨāļāļāļģāļāļ§āļāļāļēāļĢāļāļķāļāļāđāļāļĄāļđāļĨāđāļāļāļēāļ°āļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ
4.Transactions: GORM āļĢāļāļāļĢāļąāļ transaction āđāļĨāļ° nested transaction āļāđāļ§āļĒāđāļŦāđāļĄāļąāđāļāđāļāđāļāđāļāļķāļāļāļ§āļēāļĄāļŠāļāļāļāļĨāđāļāļāđāļĨāļ°āļāļ§āļēāļĄāļŠāļĄāļāļđāļĢāļāđāļāļāļāļāđāļāļĄāļđāļĨāđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāđāļāđāļāļēāļāļāđāļāļĄāļđāļĨāļŦāļĨāļēāļĒ operation
5. Context and Prepared Statement Mode āļĢāļāļāļĢāļąāļ Context āđāļĨāļ°āđāļŦāļĄāļāļāļģāļŠāļąāđāļāļāļĩāđāđāļāļĢāļĩāļĒāļĄāđāļ§āđ āļāļģāđāļŦāđāļĨāļāļāļ§āļēāļĄāđāļŠāļĩāđāļĒāļāļāļāļāļāļēāļĢāđāļāļĄāļāļĩ SQL Injection
6. Batch Insert āđāļĨāļ° FindInBatches: GORM āļĄāļĩāļāļąāļāļāđāļāļąāļāļāļēāļĢāđāļāļĢāļāđāļĨāļ°āļāļēāļĢāļāđāļāļŦāļēāđāļ Batch āļāļķāđāļāļāđāļ§āļĒāļāļĢāļąāļāļāļĢāļļāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļēāļĢāļāļģāļāļēāļāđāļĄāļ·āđāļāļāļģāļāļēāļāļāļąāļāļāđāļāļĄāļđāļĨāļāļģāļāļ§āļāļĄāļēāļ
7. SQL Builder: āļāļąāļ§āļŠāļĢāđāļēāļ SQL āļāļĩāđāļĢāļāļāļĢāļąāļ Upsert, Locking, Optimizer/Index/Comment Hints, Argument āļāļĩāđāļĄāļĩāļāļ·āđāļ āđāļĨāļ° SubQuery
8.Composite Primary Key: GORM āļĢāļāļāļĢāļąāļ āļāļĩāļĒāđāļŦāļĨāļąāļāđāļāļāļāļŠāļĄ Index āđāļĨāļ° constraint āļāļģāđāļŦāđāļāļļāļāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļ schema āļāļąāļāļāđāļāļāļĄāļēāļāļāļķāđāļāđāļĨāļ°āļĢāļąāļāļāļĢāļ°āļāļąāļāļāļ§āļēāļĄāļŠāļĄāļāļđāļĢāļāđāļāļāļāļāđāļāļĄāļđāļĨāđāļāđ
9.Auto Migrations: āļāļąāļāļāđāļāļąāļāļāļēāļĢāļĒāđāļēāļĒāļāđāļāļĄāļđāļĨāļāļąāļāđāļāļĄāļąāļāļīāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļāļēāļĢāļēāļāļāļēāļāļāđāļāļĄāļđāļĨāđāļāļāļāļāđāļāđāđāļĨāļ°āļāļąāļāđāļāļ schema āđāļāđāļāļēāļĄāđāļāļāđāļāļāļāļēāļĢ
10.Logger: GORM āđāļāđāļēāļĄāļĩ ****Logger**** āļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāđāļ§āļĒāđāļŦāđāđāļĢāļē Debug āđāļĨāļ°āđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļēāļĢāļāļķāļāļāđāļāļĄāļđāļĨāđāļāđ
11.API, Plugin āđāļĨāļ° Extension: āļĄāļĩ API, Plugin āđāļĨāļ° Extension āđāļŦāđāđāļāđāđāļāđāļāļāļĢāļ°āļāļļāļ (āđāļĒāļāļ°āļĄāļēāļ) āļāļģāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāļīāđāļĄāļāļąāļāļāđāļāļąāļāļāļēāļĢāļāļģāļāļēāļāđāļāļīāđāļĄāđāļāļīāļĄāļŦāļĢāļ·āļāļāđāļāļāļąāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļ·āđāļ āđ āđāļāđāļāļĩāļāļĄāļēāļāļĄāļēāļĒ
12.Developer Friendly: āđāļŦāļĨāđāļēāđāļāļāļāļĒāđāļēāļāđāļĢāļē āđ āļāļ°āļĒāļīāđāļĄāļāđāļēāļĒāđāļāļĢāļēāļ°āļĄāļąāļāđāļāđāđāļāđāļāđāļēāļĒ Docs āļāđāļāđāļēāļāđāļĄāđāļĒāļēāļ āđāļāļĢāļāļĒāļēāļāļāđāļēāļāđāļāļīāđāļĄāđāļāļīāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļģāđāļāđāļāļĩāđ [GORM Guides | GORM – The fantastic ORM library for Golang, aims to be developer friendly.](https://gorm.io/docs/)
9.Auto Migrations: āļāļąāļāļāđāļāļąāļāļāļēāļĢāļĒāđāļēāļĒāļāđāļāļĄāļđāļĨāļāļąāļāđāļāļĄāļąāļāļīāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļāļēāļĢāļēāļāļāļēāļāļāđāļāļĄāļđāļĨāđāļāļāļāļāđāļāđāđāļĨāļ°āļāļąāļāđāļāļ schema āđāļāđāļāļēāļĄāđāļāļāđāļāļāļāļēāļĢ
10.Logger: GORM āđāļāđāļēāļĄāļĩ Logger āļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāđāļ§āļĒāđāļŦāđāđāļĢāļē Debug āđāļĨāļ°āđāļāļīāđāļĄāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļēāļĢāļāļķāļāļāđāļāļĄāļđāļĨāđāļāđ
11.API, Plugin āđāļĨāļ° Extension: āļĄāļĩ API, Plugin āđāļĨāļ° Extension āđāļŦāđāđāļāđāđāļāđāļāļāļĢāļ°āļāļļāļ (āđāļĒāļāļ°āļĄāļēāļ) āļāļģāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāļīāđāļĄāļāļąāļāļāđāļāļąāļāļāļēāļĢāļāļģāļāļēāļāđāļāļīāđāļĄāđāļāļīāļĄāļŦāļĢāļ·āļāļāđāļāļāļąāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļ·āđāļ āđ āđāļāđāļāļĩāļāļĄāļēāļāļĄāļēāļĒ
12.Developer Friendly: āđāļŦāļĨāđāļēāđāļāļāļāļĒāđāļēāļāđāļĢāļē āđ āļāļ°āļĒāļīāđāļĄāļāđāļēāļĒāđāļāļĢāļēāļ°āļĄāļąāļāđāļāđāđāļāđāļāđāļēāļĒ Docs āļāđāļāđāļēāļāđāļĄāđāļĒāļēāļ āđāļāļĢāļāļĒāļēāļāļāđāļēāļāđāļāļīāđāļĄāđāļāļīāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļģāđāļāđāļāļĩāđ GORM Guides | GORM – The fantastic ORM library for Golang, aims to be developer friendly.
āđāļĄāļ·āđāļāđāļĢāļēāđāļāđāļĢāļđāđāļāļąāļāļāļąāļ GORM āļāļąāļāđāļāđāļĨāđāļ§āđāļĢāļēāļĄāļēāļāļđāļ§āļīāļāļĩāļāļēāļĢāđāļāđāļāļēāļāđāļāļ·āđāļāļāļāđāļāļāļąāļāļāļĩāļāļ§āđāļēāļēāļēāļē
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļēāļ GORM āļāđāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ MySQL
1.āđāļĢāļīāđāļĄāļāļēāļāļŠāļĢāđāļēāļāđāļāļĨāđāļāļāļĢāđāđāļāļĢāđāļāļāļāđāļāđāļ§āļĒāļāļģāļŠāļąāđāļ md <āļāļ·āđāļāđāļāļĨāđāļāļāļĢāđ> Â āđāļĨāđāļ§āļāļģāļāļēāļĢ cd <āļāļ·āđāļāđāļāļĨāđāļāļāļĢāđ> āļŦāļĨāļąāļāļāļēāļāļāļąāđāļāđāļāļīāļāđāļāļĢāđāļāļĢāļĄ VS Code āļāđāļ§āļĒāļāļģāļŠāļąāđāļ code .
2. āđāļĢāļīāđāļĄāļāļēāļāļāļēāļĢāļŠāļĢāđāļēāļ go mod āļāļāļāđāļāļĢāđāļāļāļāđāļāđāļ§āļĒāļāļģāļŠāļąāđāļ go mod init <github repo>/āļāļ·āđāļāđāļāļĢāđāļāļāļāđ
3. āļāļīāļāļāļąāđāļ GORM āļāđāļ§āļĒāļāļģāļŠāļąāđāļ go get -u gorm.io/gorm
4. āļŠāļĢāđāļēāļāđāļāļĨāđ main.go āđāļĢāļīāđāļĄāļāđāļāļāļĢāļ°āļāļēāļĻ package āđāļĢāļīāđāļĄāļāđāļāđāļāđāļ main āļŠāļĢāđāļēāļāļāļąāļāļāđāļāļąāļ main āđāļŦāđāđāļĢāļĩāļĒāļāļĢāđāļāļĒ āđāļĨāļ°āļāļģāļāļēāļĢ import “gorm.io/gorm” āļĄāļēāļāđāļ§āļĒāļāļ°
package main
import (
"gorm.io/gorm"
)
func main() {
}
5. āļāđāļāļĄāļēāļāļģāļŦāļāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāļāđāļāļĄāļđāļĨ āļāļ·āđāļāļāļēāļĢāļēāļāđāļĨāļ°āļāļīāļĨāļāđāļāđāļēāļ āđ (āļāļāļĨāļąāļĄāļāđāļāļāļāļāļēāļĢāļēāļ) āļ§āđāļēāļĄāļĩāļāļ°āđāļĢāļāđāļēāļāđāļāļĒāđāļ Go āđāļ§āļĨāļēāļāļĩāđāđāļāļĩāļĒāļāđāļāđāļ ORM āđāļĢāļēāļāļ°āđāļāļĩāļĒāļāļāļĒāļđāđāđāļāļĢāļđāļāđāļāļ Struct āļāļ°
āđāļāļāļąāļ§āļāļĒāđāļēāļāļāļĩāđ āđāļĢāļēāđāļāđāļāļģāļŦāļāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāļāļēāļĢāļēāļ `User` āļāđāļ§āļĒāļāļīāļĨāļāđ ID, Name, Email, Age, CreateAt āđāļĨāļ° UpdatedAt āđāļĨāļ°āđāļĢāļēāļĄāļĩāļāļēāļĢāđāļāđ gorm āđāļāļāļēāļĢāļāļģāļŦāļāļāļāđāļāļāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ°āļāļīāļĨāļāđ
type User struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"not null"`
Email string `gorm:"unique"`
Age int
CreatedAt time.Time
UpdatedAt time.Time
}
āļŠāđāļ§āļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ
6. āļāđāļāļĄāļēāđāļĢāļēāļāđāļĄāļēāļāļģāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨāđāļāļĒāļāļąāļ§āļāļĒāđāļēāļāļāļĩāđāļāļĄāļāļ°āđāļāđāđāļāđāļ MySQL āđāļāđāđāļĄāđāđāļāđāļ§āđāļē GORM āļāļ°āļāđāļāđāļāđāđāļāđ MySQL āļāļ° āļĄāļąāļāļĒāļąāļāļāđāļāļāļąāļ PostgreSQL, SQLite, SQL Server, āđāļĨāļ° TiDB āđāļāđāļāļĩāļāļāđāļ§āļĒ āđāļāļĒāđāļāļŠāđāļ§āļāļāļāļāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļēāļ MySQL āļāļ°āļāđāļāļāļāļģāļāļēāļĢāļāļīāļāļāļąāđāļāļāđāļ§āļĒāļāļģāļŠāļąāđāļ go get gorm.io/driver/mysql
āđāļĨāļ°āđāļĢāļĩāļĒāļāđāļāđāļāļēāļāđāļāļŠāđāļ§āļāļāļāļ import āļāđāļ§āļĒāļāļ°āļāļĢāļąāļ
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
7. āļāļēāļĢāļŠāļĢāđāļēāļ GORM Database Connection āđāļāļ·āđāļāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ MySQL
db, err := gorm.Open(mysql.Open("username:password@tcp(127.0.0.1:3306)/āļāļ·āđāļāļāļēāļāļāđāļāļĄāļđāļĨ?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
if err != nil {
panic("failed to connect to database")
}
- mysql.Open: āđāļāđāļāļāļēāļĢāļĢāļ°āļāļļāļ§āđāļēāđāļĢāļēāļāļģāļĨāļąāļāđāļāđāđāļāļĢāđāļ§āļāļĢāđ MySQL āđāļāļ·āđāļāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ
- &gorm.Config{}: āļŠāļĢāđāļēāļ GORM Config āđāļŦāļĄāđāļāļĢāđāļāļĄāļāđāļē default
- db, err := gorm.Open(…): āđāļāļīāļ Database Connection āđāļŦāļĄāđāđāļāļĒāđāļāđāđāļāļĢāđāļ§āļāļĢāđāđāļĨāļ° Configuration
- if err != nil {…}: āđāļāđāļāļāļąāļ§āđāļāđāļ error
8. āļāđāļāļāļāļĩāđāđāļĢāļēāļāļ°āđāļāđ User model āđāļāđ āđāļĢāļēāļāđāļāļāļŠāļĢāđāļēāļāļāļēāļĢāļēāļāđāļāļāļēāļāļāđāļāļĄāļđāļĨāļāđāļāļ āđāļāļĒāđāļāđāļāļąāļāļāđāļāļąāļ AutoMigrate āļāļāļ GORM āļāļąāļāļāđāļāļąāļāļāļĩāđāļāļ°āļŠāļĢāđāļēāļāļāļēāļĢāļēāļāļŠāļģāļŦāļĢāļąāļ User model āđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī
db.AutoMigrate(&User{})
9. āđāļĄāļ·āđāļāđāļĢāļēāļāļģāļāļēāļĢāļāđāļāļāļąāļāļāļēāļāļāđāļāļĄāļđāļĨāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§āļāđāļāļĄāļēāđāļĢāļēāļĄāļēāļĨāļāļāļāļģ CRUD Operation āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļīāđāļĄāļāđāļāļĄāļđāļĨ āļāļķāļāļāđāļāļĄāļđāļĨ āļāļąāļāđāļāļāļāđāļāļĄāļđāļĨ āđāļĨāļ°āļĨāļāļāļĨāļāļāđāļāļĄāļđāļĨāđāļāļāļēāļāļāđāļāļĄāļđāļĨāļāđāļ§āļĒ Go āļāļąāļāļāļĢāļąāļ
Create Operation
10. āļāļēāļĢāđāļāļīāđāļĄāļāđāļāļĄāļđāļĨāđāļāļĒāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ āđāļĢāļēāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļ User āļāļāđāļŦāļĄāđāđāļāđāļēāđāļāđāļāđāđāļāļĒāđāļāđāļāļąāļāļāđāļāļąāļ Create āļāļĩāđāļĄāļēāļāļąāļ GORM āđāļāđāđāļĨāļĒ āđāļāđāļ āđāļĢāļēāļāļ°āļĨāļāļāļŠāļĢāđāļēāļ User āļāļ·āđāļ Sirasit, āļāļĩāđāļĄāļĨāļāļ·āļ sirasit@example.com āđāļĨāļ°āļāļēāļĒāļļāđāļāđāļ 25 āļāļĩ āđāļĨāđāļ§āđāļāđāļāļąāļāļāđāļāļąāļ Create āļāļ°āđāļāļĩāļĒāļāđāļāđāļāļēāļĄāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
user := User{
Name: "Sirasit",
Email: "sirasit@example.com",
Age: 25,
}
result := db.Create(&user)
if result.Error != nil {
panic("failed to create user")
}
āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāđāļāļāđāļāđāļĄ āđ āļāļ°āļāļĢāļąāļ
package main
import (
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
ID uint `gorm:"primarykey"`
Name string `gorm:"not null"`
Email string `gorm:"unique"`
Age int
CreatedAt time.Time
UpdatedAt time.Time
}
func main() {
db, err := gorm.Open(mysql.Open("āļāļ·āđāļāļāļđāđāđāļāđ:āļĢāļŦāļąāļŠāļāđāļēāļ(127.0.0.1:3306)/āļāļ·āđāļāļāļēāļāļāđāļāļĄāļđāļĨ?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
if err != nil {
panic("failed to connect to database")
}
db.AutoMigrate(&User{})
user := User{
Name: "Sirasit",
Email: "sirasit@example.com",
Age: 25,
}
result := db.Create(&user)
if result.Error != nil {
panic("failed to create user")
}
}
āļāļĨāļĨāļąāļāļāđāļāļĩāđāđāļāđāļāļēāļāļāļēāļĢāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāļāļ°āđāļŦāđāļāđāļāđāļ§āđāļēāļĄāļĩāļāđāļāļĄāļđāļĨāļāļĩāđāđāļĢāļēāđāļāđāļāļģāļāļēāļĢāđāļāļīāđāļĄāđāļāđāļēāđāļ āđāļāļāļĒāļđāđāđāļāļāļēāļāļāđāļāļĄāļđāļĨāđāļāđāļāļāļĩāđāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§āļāļ°āļāļĢāļąāļ āļŠāļģāļŦāļĢāļąāļāđāļāļāļāļāļāļĩāđāļāļĄāļāļ°āđāļāđāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļĩāđāļāļ·āđāļāļ§āđāļē MySQL Workbench āđāļāļāļēāļĢāđāļĢāļĩāļĒāļāļāļđāļāđāļāļĄāļđāļĨāļāļ°āļāļĢāļąāļ
āļŠāļģāļŦāļĢāļąāļāđāļāļĢāļāļĩāđāļāļĒāļēāļāļāļđāļ§āļīāļāļĩāļāļēāļĢāđāļāđāļāļēāļ MySQL Workbench āļŠāļēāļĄāļēāļĢāļāļāļđāļāļąāđāļāļāļāļāļāļēāļĢāđāļāđāļāļēāļāļĢāđāļ§āļĄāļāļąāļāļ āļēāļĐāļē Go āđāļāđāļāļĩāđ https://youtu.be/fjEB75Xotxc?t=12764
Read Operation
11. āđāļāļāļēāļĢāļāđāļēāļāļāđāļāļĄāļđāļĨāļāļēāļāļāļēāļāļāđāļāļĄāļđāļĨāđāļĢāļēāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļąāļāļāđāļāļąāļ Find āđāļĨāļ° First āđāļāđ āđāļāļĒāđāļĄāļ·āđāļāđāļĢāļēāđāļāđāļāļģāļāļēāļĢāļāļķāļāļāđāļāļĄāļđāļĨāļĄāļēāđāļĨāđāļ§āđāļĢāļēāļāļ°āļāļģāļāļēāļĢāđāļāđāļ Error āđāļĨāļ°āđāļāđ for loop āđāļāļāļēāļĢāļāļķāļāļāđāļēāļāļāļāļāđāļāļĄāļđāļĨāđāļāđāļĨāļ°āļāļąāļ§āļāļāļāļĄāļēāđāļŠāļāļ
var users []User
result := db.Find(&users)
if result.Error != nil {
panic("Failed to find users")
}
for _, user := range users {
fmt.Printf("ID: %d, Name: %s, Email: %s, Age: %d\n", user.ID, user.Name, user.Email)
}
āļŦāļĢāļ·āļāļŦāļēāļāļāđāļāļāļāļēāļĢāļāļķāļāđāļāļāļēāļ° ID āļāļąāđāļ āđ āđāļĢāļēāļāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļąāļāļāđāļāļąāļ First āļŦāļĢāļ·āļ Find āđāļĨāļ°āļāđāļēāļāļāđāļēāļāļāļāļāļąāļ§āđāļāļĢāļāļ·āđāļāļāļēāļĢāļēāļāđāļĨāļ° ID āđāļāđāļēāđāļāđāļāđ
var user User
result := db.Find(&user, 1) // Find the user with ID 1
if result.Error != nil {
panic(result.Error)
}
fmt.Println(user)
Update Operation
12. āđāļāļāļēāļĢāļāļąāļāđāļāļāđāļĢāļēāļŠāļēāļĄāļēāļĢāļāđāļāđ Method Model() āđāļĨāļ° Updates() āđāļāļāļēāļĢāļāļąāļāđāļāļāļāđāļāļĄāļđāļĨāđāļāđ āđāļāļĒāđāļāļāļąāļ§āļāļĒāđāļēāļāļāļĩāđ āļāļ°āđāļāđ db.First() āđāļāļ·āđāļāļāđāļāļŦāļē user āļāļĩāđāļĄāļĩ ID āđāļāđāļ 1 āđāļĨāđāļ§āļāđāđāļāđ db.Model().Updates() āđāļāļ·āđāļāļāļąāļāđāļāļ Name āđāļŦāđāđāļāđāļ “Sirasit Boonklang” āđāļāļ āđāļĨāļ°āđāļāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāļāļĩāđāļāļĄāļāđāļĄāļĩāļāļēāļĢāđāļāđāļ Error āđāļĨāļ°āļāļģāļāđāļāļĄāļđāļĨ ID āļāļĩāđāļĄāļĩāļāļēāļĢāļāļąāļāđāļāļāļĄāļēāđāļŠāļāļāļāđāļ§āļĒ
var user User
db.First(&user, 1)
db.Model(&user).Updates(User{Name: "Sirasit Boonklang"})
result := db.First(&user, 1)
if result.Error != nil {
panic(result.Error)
}
fmt.Println(user)
Delete Operation
13. āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļĨāļāļāđāļāļĄāļđāļĨāđāļāļāļēāļāļāđāļāļĄāļđāļĨāđāļĢāļēāļŠāļēāļĄāļēāļĢāļāđāļāđ Method Delete āļāļāļ GORM āđāļāđāđāļĨāļĒāđāļāļĒāđāļāđāļāļģāļŠāļąāđāļ db.Delete()
var user User
result := db.Find(&user, 1)
if result.Error != nil {
panic(result.Error)
}
result = db.Delete(&user)
if result.Error != nil {
panic(result.Error)
}
āđāļĨāļ°āđāļĨāđāļ§āļāļāļāļāļĩāđāđāļĢāļēāļāđāđāļāđāđāļĢāļĩāļĒāļāļĢāļđāđāļāļ·āđāļāļāļēāļāđāļāļ·āđāļāļāļāđāļāđāļāļĩāđāļĒāļ§āļāļąāļ GORM āđāļāđāļĨāđāļ§āļāļ°āļāļĢāļąāļ āđāļāđāđāļĢāļēāļĒāļąāļāļāļīāļāđāļāļŠāđāļ§āļāļāļāļāļāļēāļĢāđāļāđ gorm.Model āļāļąāļāļāļ°āļāļĢāļąāļ āđāļāļĩāđāļĒāļ§āļāļĄāļāļ°āļāļēāđāļāļāļđāļ§āđāļēāļāļēāļĢāđāļāđ gorm.Model āļĄāļąāļāļāđāļ§āļĒāđāļĢāļēāļĒāļąāļāđāļāđāļāđāļāđāļēāļāđāļāļāļđāļāļąāļāļāļĢāļąāļ
gorm.Model āļāļ·āļāļāļ°āđāļĢ
gorm.Model āđāļāđāļ Struct āļāļĩāđāļĄāļēāļāļąāļāđāļāđāļē GORM Lib āļāļąāļ§āļāļĩāđ āđāļāļĒ gorm.Model āļāļ°āļĄāļēāļāļĢāđāļāļĄāļāļąāļāļāļīāļĨāļāđ ID, CreateAt, UpdateAt, DeletedAt āļāļķāđāļāļāļāļāļīāđāļĨāđāļ§āļāļēāļāļāđāļāļĄāļđāļĨāļŠāđāļ§āļāđāļŦāļāđāļāđāļāļ°āļĄāļĩāļāļīāļĨāļāđāđāļŦāļĨāđāļēāļāļĩāđāļāļĒāļđāđ
// gorm.Model definition
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
āđāļāļĒ ID āļāļ°āđāļāđāļāļāļīāļĨāļāđāļāļĩāđāđāļāđāļ Primary Key āļāļāļāđāļĄāđāļāļĨ, CreateAt āđāļāļēāđāļ§āđāđāļāđāļāļ§āđāļēāđāļ§āļĨāļēāļāļĩāđāļāđāļāļĄāļđāļĨāļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļāļĄāļē, UpdateAt āļŠāļģāļŦāļĢāļąāļāđāļāđāļāđāļ§āļĨāļēāļāļĩāđāļĄāļĩāļāļēāļĢāļāļąāļāđāļāļāļĨāđāļēāļŠāļļāļ āđāļĨāļ°āļāļīāļĨāļāđāļŠāļļāļāļāđāļēāļĒāļāļ·āļ DeletedAt āđāļāđāļāļāļīāļĨāļāđāļāļĩāđāļāļ°āļāļąāļāļāļķāļāđāļ§āļĨāļēāđāļĨāļ°āļāļģāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāļ§āđāļēāļĨāļāđāļĨāđāļ§āļāļąāđāļāđāļāļāđāļāđāļāđāļāļ Soft Delete
āđāļĄāļ·āđāļāđāļĢāļēāļāļ°āđāļāđ gorm.Model āđāļĢāļēāđāļāđāđāļāļ°āļāļģāļŠāļąāđāļāđāļ§āđāđāļ Struct āļāļāļāļāļēāļĢāļēāļāļāđāļāļĄāļđāļĨāđāļĢāļē āđāļāļĩāļĒāļāđāļāđāļēāļāļĩāđāđāļĢāļēāļāđāļāļ°āđāļāđāļāļīāļĨāļāđāļāļāļ gorm.Model āļĄāļēāđāļāđāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§āļ§āļ§
type User struct {
gorm.Model
Name string `gorm:"not null"`
Email string `gorm:"unique"`
Age int
}
āđāļāđāļāļĒāļąāļāđāļāļāđāļēāļāļāļĢāļąāļāļāļēāļĢāđāļāđāļāļēāļ GORM āđāļĄāđāļĒāļēāļāđāļĨāļĒāđāļāđāļĄāļąāđāļĒāļāļĢāļąāļ āļŦāļēāļāđāļāļ·āđāļāļ āđ āļāļĒāļēāļāļāļķāļāļŠāļāļīāļĨāđāļāļīāđāļĄāđāļāļīāļĄāđāļāļĩāđāļĒāļ§āļāļąāļāļāļēāļĢāđāļāđāļāļēāļ GORM āļāđāļēāļāđāļāļīāđāļĄāđāļāļīāļĄāđāļāđāļāļēāļ Docs āđāļāļĨāļīāļāļāđāļāļĩāđāđāļāđāđāļĨāļĒāļāļ°āļāļĢāļąāļ GORM Guides | GORM – The fantastic ORM library for Golang, aims to be developer friendly.
āđāļĨāļ°āļŦāļēāļāļāļĒāļēāļāļĢāļđāđāļ§āđāļēāļāđāļēāđāļĢāļēāđāļĄāđāđāļāđ GORM āļāļģ CRUD āđāļāļāļāļāļāļīāļāļēāļ Standard Library āđāļĨāļĒāļĄāļĩāļ§āļīāļāļĩāļāļēāļĢāļĒāļąāļāđāļāļāđāļēāļāđāļĨāļ°āđāļāļāļāđāļēāļāļāļąāļāļĒāļąāļāđāļāļŠāļēāļĄāļēāļĢāļāļāļđāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļģāđāļāđāļāļĩāđ (572) āļŠāļāļāļāļģ CRUD āļāđāļ§āļĒ Golang āđāļāļāđāļĄāđāđāļāļĢāļāđāļāđāļāļĢ ! – YouTube
- app = Flask(name): āļāļĩāđ āļŠāđāļ§āļāđāļāļāļēāļĢāļŠāļĢāđāļēāļ Flask Instance āđāļĢāļīāđāļĄāļāđāļ
- app.config[‘SECRET_KEY’] = ‘SECRET_KEY’ : āđāļāļāļāļĢāļīāļāļīāļ§āļāđ app.config āđāļāđāļ dict āđāļāļāļēāļĢāđāļāđāļāļāļēāļĢ config āļāđāļēāļ āđ āļāļāļāđāļāļ āļāļ°āļāļąāđāļāļāđāļēāļāļāļāļāļąāļ§āđāļāļĢ config āđāļāļĒāđāļāđ SECRET_KEY āđāļāđāļāļŠāļāļĢāļīāļ āđāļāđāđāļāđāļāļāļĩāļĒāđāļĨāļąāļāđāļāļ·āđāļāđāļāđāļēāļĢāļŦāļąāļŠāļāļļāļāļāļĩāđāđāļĨāļ°āļāđāļāļāļāļąāļāļāļēāļĢāđāļāļĄāļāļĩāļāđāļēāļāđ āđāļāđāļ āļāļēāļĢāđāļāļĄāļāļĩ CSRF
- CONNECTION_STRING = ââ : āļāļąāļ§āđāļāļĢ CONNECTION_STRING āļāļ·āļ Connection String āļāļĩāđāđāļāđāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļąāļāļāļĩ Azure Blob Storage āļāđāļēāļāļāļāļŠāļāļĢāļīāļāļāļĩāđāļĢāļ§āļĄāļāļķāļ AccountName, AccountKey, āđāļĨāļ° EndpointSuffix
- CONTAINER_NAME =ââ: āļāļ·āļ āļāļ·āđāļāļāļāļāđāļāļāđāļāļāļĢāđāđāļāļāļąāļāļāļĩ Blob Storage āļāļĩāđāļāļ°āļāļąāļāđāļāđāļāđāļāļĨāđ
āļĢāļ°āļāļāļāļķāļāļāļąāļāļĐāļ° āļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄ
āļāļĩāđāļāļĢāđāļāļĄāļāļĢāļ§āļāļāļĨāļāļēāļāļāļļāļ 24 āļāļąāđāļ§āđāļĄāļ
- āđāļāļāļĒāđāļāļąāļāļŦāļēāļāļ§āđāļē 200 āļāđāļ āļāļĩāđāļĢāļāļāđāļēāļāļēāļĒāļāļļāļāļāļĒāļđāđ
- āļĢāļāļāļĢāļąāļ 9 āļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļŦāļĨāļąāļ āđāļĄāđāļ§āđāļēāļāļ° Java, Python, C āļāđāđāļāļĩāļĒāļāđāļāđ
- āđāļāđāļāļēāļāđāļāđāļāļĢāļĩ ! āļāļĢāļ 20 āļāđāļāļāļķāđāļāđāļ āļĢāļąāļ Certificate āđāļāđāļĨāļĒ !!