DieselChen

个人博客,记录一下学习的点滴~

0%

使用Gorm遇到的坑

使用Gorm遇到的坑

Gorm是用go语言编写的orm框架,它将数据库的结构与语言(golang)本身的数据结构对应了起来,其目的是为了加快我们CRUD的速度,简化sql语句的书写,利用对象的思想,让Gorm框架为我们拼接sql语句。但是在使用过程中有不少的坑还是需要注意一下。

使用struct更新仅适用于非零值

1
2
3
4
5
6
7
8
9
10
11
12
13
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 接口来更改默认表名,例如:

1
2
3
4
5
6
7
type Tabler interface {
TableName() string
}
// TableName 会将User的表名重写为 `new_user`
func (User) TableName()string {
return "new_user"
}

可以在创建数据库连接的时候,去掉这个默认设置

1
db.SingularTable(true)

错误的使用ErrRecordNotFound

在我印象中有个错误的认知:如果Gorm没有找到record,则会返回ErrRecordNotFound 的错误,但是在具体使用中并不是这样

Demo

1
2
3
4
5
6
7
8
9
10
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)
}

结果

1
2
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

1
root:123456@tcp(127.0.0.1:3306)/mapdb?charset=utf8&parseTime=true

数据库字段映射

  • 正常的数据库字段映射 user_name 映射为UserName
  • 带梳子的数据库字段映射 api_ip_1映射为ApiIp_1而非ApiIp1

欢迎关注我的其它发布渠道

-----------本文结束感谢您的阅读-----------