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