感觉gorm文档还是太简单了,一些坑需要自己踩到再看源码才知道。
错误处理
不管什么操作,不要使用原始的DB对象获取错误,因为操作内部实际上是生成了一个新的DB对象并返回。
下面的用法是错误的:
var DB *gorm.DB
//.....
DB.Create(&user)
if DB.Error != nil {
panic(DB.Error)
}
正确的方法:
var DB *gorm.DB
//.....
if newdb := DB.Create(&user);newdb.Error != nil {
panic(newdb.Error)
}
除了Create,其他方法也一样的处理方式,可以简化一些:
if err := DB.Create(&user).Error;err != nil {
panic(err)
}
对于查询操作,找不到结果也是一种错误,所以需要判断一下
if d := DB.First(&user);d.Error != nil {
if false == d.RecordNotFound() {
panic(d.Error)
}
}
链式调用
基本上每个链式方法如:Where,Find,Limit等,都会返回一个新的DB对象,所以拆开调用的时候一定要注意替换原对象指针,举个例子:
user := User{}
model := db.Model(&user)
if typeName := c.DefaultQuery("type_name","");typeName != "" {
model.Where("type_name = ?",typeName)
}
model.Find(&user)
这样写,where条件是没有用的,因为where方法会克隆出一个新的对象,正确的写法:
user := User{}
model := db.Model(&user)
if typeName := c.DefaultQuery("type_name","");typeName != "" {
model = model.Where("type_name = ?",typeName)
}
model.Find(&user)