gorm使用规范和最佳实践,仅做参考
logger
在开发环境或者本地应该默认开启logger打印所有sql,以便追踪sql的执行过程:
if os.Getenv("env") == "local" {
db.LogMode(true)
}
共享代码
官网的例子很好了,直接抄过来用:
func Paginate(r *http.Request) func(db *gorm.DB) *gorm.DB {
return func (db *gorm.DB) *gorm.DB {
page, _ := strconv.Atoi(r.Query("page"))
if page == 0 {
page = 1
}
pageSize, _ := strconv.Atoi(r.Query("page_size"))
switch {
case pageSize > 100:
pageSize = 100
case pageSize <= 0:
pageSize = 10
}
offset := (page - 1) * pageSize
return db.Offset(offset).Limit(pageSize)
}
}
db.Scopes(Paginate(r)).Find(&users)
db.Scopes(Paginate(r)).Find(&articles)
默认值
通过default字段指定某个字段默认值:
type User struct {
ID int64
Name string `gorm:"default:galeone"`
Age int64 `gorm:"default:18"`
}
对于golang,默认结构体字段零值,而gorm默认会忽略零值更新。因为零值在struct转换为map的时候会被忽略。 如果想要更新零值字段,可以使用save方法,或者使用map。个人推荐也可以使用指针,例如:
var isTeacher *bool // 默认为nil,赋值后可以对该字段进行更新
其他
Pluck:使用pluck用于从数据库查询单个列,并扫描到切片中,需要注意的是pluck会产生SQL注入
resolver:对于多副本的数据库采用random策略
数据类型:uint8在序列化的时候建议转换为int8,因为byte的本质就是uint8
读写分离:除了默认的select,其他sql执行都会默认在主库执行
最后提一个问题:在读写分离的数据库中,带事务的读取执行是否默认会使用数据库的主库进行读取?