0%

golang的gorm和ent库

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 用表生成结构体代码

  • 生成 model
1
2
3
4
5
6
7
go install gorm.io/gen/tools/gentool@latest

# 生成 model
gentool -dsn "root:root@tcp(localhost:3306)/if_only?charset=utf8mb4&parseTime=True&loc=Local" -onlyModel -fieldWithTypeTag

# 生成某个表的 model
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

AutoMigrate 用于自动迁移您的 schema,保持您的 schema 是最新的。
AutoMigrate 会创建表、缺失的外键、约束、列和索引。如果大小、精度、是否为空可以更改,则 AutoMigrate 会改变列的类型。出于保护您数据的目的,它 不会删除未使用的列。

1
2
3
db.AutoMigrate(&User{}, &Product{}, &Order{})
// 检查 `User` 对应的表是否存在
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"`
}
// column order: number, name

2. ent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1. 增加schema
cd internal/dao/
ent new Adjust


# 2. 增加属性
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(""),
}

# 3. 生成代码
ent generate --feature intercept,schema/snapshot,sql/upsert ./schema

3. 参考文档

可以加首页作者微信,咨询相关问题!