Gorm 的一些操作| 青训营

103 阅读2分钟

本文只是用来记录下我在写项目中所用到的一些方法,仅代表我个人观点,欢迎交流讨论。

  1. 在使用 Gorm 进行数据库的 CURD 的时候,可以通过下面的语句在执行任何一条 SQL 语句时创建一条准备好的语句并缓存它们,可以用来加快以后用的时候的调用速度。 PrepareStmt: true

直接加到 gorm.Config 中就行,虽然没感觉快多少。。。

func Init() {
    var err error
    conf := config.C.MySQL
    if DB, err = gorm.Open(mysql.Open(
       fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=true&loc=Local&interpolateParams=true",
          conf.User, conf.Password, conf.Host, conf.Port, conf.Database),
    ), &gorm.Config{
       Logger:      getLogger(),
       PrepareStmt: true,
    }); err != nil {
       log.Panicln(err)
    }
}
  1. 我们可以直接使用 Pluck 来方便地去选取某一列,优点是可以少写一个 .Select() 和 .Find()。当然了如果要选择多列,那好像还是只能用 .Select() 和 .Find()。
var ages []int64
db.Model(&users).Pluck("age", &ages)
  1. 可以直接用 Gorm 带的 Count() 来代替 .Select("count(*)") 可以直接计算出数据的总数,不过注意,要用的是 int64 的类型。
var count int64
db.Model(&User{}).Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Count(&count)
// SELECT count(1) FROM users WHERE name = 'jinzhu' OR name = 'jinzhu 2'
  1. 查询并初始化和查询并创建 利用 FirstOrInit 和 FirstOrCreate,可以在查找不到某一条记录的时候直接赋我们给定的初始值,或者可以直接在数据库中插入默认或给定的一些数据,在某些情况下十分的方便。
db.FirstOrInit(&user, User{Name: "non_existing"})

上面的代码会在没找到这个 user 的时候 插入一条这个用户的数据, 并且让 user 解析为 User{Name: "non_existing"}

result := db.FirstOrCreate(&user, User{Name: "non_existing"})

同理,这条是直接插入到数据库,具体是执行

INSERT INTO "users" (name) VALUES ("non_existing");

同时 user 也是变为 User{ID: 112, Name: "non_existing"}

如果查询 RowsAffected 的话会返回 1 。

result.RowsAffected // => 1

同时它们都还有一个还有一个 .Attrs 可以在不影响查询构建条件的时候指定我们想要的值。

db.Where(User{Name: "non_existing"}).Attrs(User{Age: 20}).FirstOrInit(&user)
// SELECT * FROM USERS WHERE name = 'non_existing' ORDER BY id LIMIT 1;
// user -> User{Name: "non_existing", Age: 20}

以上只是对 Gorm 的一些简单介绍,更多的例子可以查看 Gorm 的官方文档: gorm.io/docs/advanc…