Gin 框架 Gorm更新零值
Gorm是用go语言编写的orm框架,它将数据库的结构与语言(golang)本身的数据结构对应了起来,其目的是为了加快我们CRUD的速度,简化sql语句的书写,利用对象的思想,让Gorm框架为我们拼接sql语句。但是在使用过程中有不少的坑还是需要注意一下。
使用struct更新仅适用于非零值
user:=User{
Name:"",
Age:0,
Actived:false,
}
db.Model(&user).Updates(user)
//此时不会更新这些零值,如需更新零值使用map
userMap:=map[string]interface{}{
"name":"",
"age":0,
"actived":0,
}
db.Model(&user).Updates(userMap)
Gorm表名尾部自动加s
Gorm处理数据结构的时候遵循的是首字母规则和驼峰规则。对于结构体User,根据约定,其表名为users。
这里有两种方式去修改表名:第一种就是去掉这个默认设置;第二种就是在保留默认设置的基础上通过重新设定表名来替换。
先说如何通过重新设定表名来替换,可以实现 Tabler 接口来更改默认表名,例如:
type Tabler interface {
TableName() string
}
// TableName 会将User的表名重写为 `new_user`
func (User) TableName()string {
return "new_user"
}
可以在创建数据库连接的时候,去掉这个默认设置
db.SingularTable(true)
错误的使用ErrRecordNotFound
在我印象中有个错误的认知:如果Gorm没有找到record,则会返回ErrRecordNotFound 的错误,但是在具体使用中并不是这样
Demo
func main() {
db := gorm.Open("mysql",url)
user := &User{}
users := make([]*User, 0, 0)
err := db.Model(user).Where("id = ?", 1).First(user).Error
fmt.Println(err, user)
err = db.Model(user).Where("id = ?", 1).Find(&users).Error
fmt.Println(err, user)
}
结果
record not found &{0 }
<nil> &{0 }
使用Gorm.Model后无法查询数据
- Scan error on column index 1, name “created_at”: unsupported Scan, storing driver.Value type []uint8
解决方法:
打开数据库的时候加上parseTime=true
root:123456@tcp(127.0.0.1:3306)/mapdb?charset=utf8&parseTime=true
数据库字段映射
- 正常的数据库字段映射 user_name 映射为UserName
- 带数字的数据库字段映射 api_ip_1映射为ApiIp_1而非ApiIp1