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