1. gorm
1.1 初始化连接
1 2 3 4 5 6
| dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", c.Mysql.User, c.Mysql.Password, c.Mysql.Host, c.Mysql.Port, c.Mysql.Name) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { logx.Must(err) }
|
1.2 用表生成结构体代码
1 2 3 4 5 6 7
| go install gorm.io/gen/tools/gentool@latest
gentool -dsn "root:root@tcp(localhost:3306)/if_only?charset=utf8mb4&parseTime=True&loc=Local" -onlyModel -fieldWithTypeTag
gentool -dsn "user:password@tcp(10.28.11.11:3306)/dev_db?charset=utf8mb4&parseTime=True&loc=Local" -onlyModel -fieldWithTypeTag --tables=tasks_video
|
1 2 3 4
| err = l.svcCtx.Query.Adjust.WithContext(l.ctx).Create(&model.Adjust{}) if err != nil { logx.WithContext(l.ctx).Errorf("AdjustInstallNotify Create error: %v", err) }
|
1.3 用结构体生成或迁移表
AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。
AutoMigrate 会创建表、缺失的外键、约束、列和索引。如果大小、精度、是否为空可以更改,则 AutoMigrate 会改变列的类型。出于保护您数据的目的,它 不会删除未使用的列。
1 2 3
| db.AutoMigrate(&User{}, &Product{}, &Order{})
db.Migrator().HasTable(&User{})
|
1.4 执行动作Hooks
Hooks(一般称之为钩子函数) 的功能是在运行创建/查询/更新/删除语句之前或者之后执行。
执行顺序参考:https://gorm.io/docs/hooks.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| func (u *User) BeforeCreate(tx *gorm.DB) (err error) { u.UUID = uuid.New()
if !u.IsValid() { err = errors.New("can't save invalid data") } return }
func (u *User) AfterCreate(tx *gorm.DB) (err error) { if u.ID == 1 { tx.Model(u).Update("role", "admin") } return }
|
1.5 标签用法
Use same index name for two fields will creates composite indexes, for example:
1 2 3 4 5
| type User struct { Name string `gorm:"index:idx_member,priority:2"` Number string `gorm:"index:idx_member,priority:1"` }
|
2. ent
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| cd internal/dao/ ent new Adjust
return []ent.Field{ field.String("idfv").Default("").Comment("数数的distinct_id"), field.String("network_name").Default(""), field.String("campaign_id").Default(""), field.String("campaign_name").Default(""), }
ent generate --feature intercept,schema/snapshot,sql/upsert ./schema
|
3. 参考文档