Gorm使用规范&&最佳实践4/4|Go主题月

1,348 阅读1分钟

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执行都会默认在主库执行

最后提一个问题:在读写分离的数据库中,带事务的读取执行是否默认会使用数据库的主库进行读取?