searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

gorm使用过程中的默认值问题

2024-11-15 09:17:54
17
0

1. 默认值

何为默认值尼。
例如对于整型int来说,0就是它的默认值。
例如对于字符串string来说,“”就是它的默认值。
例如对于布尔bool来说,false就是它的默认值。

2. gorm默认值里的一些坑点

2.1 查询单条语句

假设你传入的User{ID:0}, 这样子是不会按照 where id=0来进行查询的。

如下图的官方文档带有一点点误导,没有说清楚这个问题。

image.png

解决方法: 如果真的就要根据id=0来进行查询数据。
那么db.First(&user, "id = ?", 0) 这样子来进行查询

2.2 更新某个字段

例如我有一个字段是int类型,然后当前是1值, 我希望更新为0值。

假设我使用如下的方式进行更新,是不会更新成功的。

db.Model(&user).Updates(User{ID:0,Name:"hehe"})

解决方案: db.Mdel(&user).Updates(map[string]interface{}{"id": 0})

3. 分析

3.1 使用指针类型

其实主要就是在更新一个数据struct 给到gorm的时候, orm框架没办法去区分你这个字段究竟是没有赋值,还是人工赋值为默认值。

除了上面的解决方案,其实还有另外一种。

就是 使用*int类型定义整型, 也就是

type User struct {
ID *int

}

因为这样子就是指针, 指针的默认是是nill。

3.2 避免默认值的出现在业务含义里

例如 我们会这样子定义业务状态

StatusOnline int = 0 << iota
StatusOffline
StatusUnknow

这样子就从0开始默认递增。
应该改成如下

StatusOnline int =1 << iota

4. 总结

由于官方文档的简洁,所以可能初用gorm的同学来说容易采坑。这里简单说明一下,这块的经验,希望对你的go编程中能有作用

0条评论
0 / 1000
郑****辉
7文章数
1粉丝数
郑****辉
7 文章 | 1 粉丝
原创

gorm使用过程中的默认值问题

2024-11-15 09:17:54
17
0

1. 默认值

何为默认值尼。
例如对于整型int来说,0就是它的默认值。
例如对于字符串string来说,“”就是它的默认值。
例如对于布尔bool来说,false就是它的默认值。

2. gorm默认值里的一些坑点

2.1 查询单条语句

假设你传入的User{ID:0}, 这样子是不会按照 where id=0来进行查询的。

如下图的官方文档带有一点点误导,没有说清楚这个问题。

image.png

解决方法: 如果真的就要根据id=0来进行查询数据。
那么db.First(&user, "id = ?", 0) 这样子来进行查询

2.2 更新某个字段

例如我有一个字段是int类型,然后当前是1值, 我希望更新为0值。

假设我使用如下的方式进行更新,是不会更新成功的。

db.Model(&user).Updates(User{ID:0,Name:"hehe"})

解决方案: db.Mdel(&user).Updates(map[string]interface{}{"id": 0})

3. 分析

3.1 使用指针类型

其实主要就是在更新一个数据struct 给到gorm的时候, orm框架没办法去区分你这个字段究竟是没有赋值,还是人工赋值为默认值。

除了上面的解决方案,其实还有另外一种。

就是 使用*int类型定义整型, 也就是

type User struct {
ID *int

}

因为这样子就是指针, 指针的默认是是nill。

3.2 避免默认值的出现在业务含义里

例如 我们会这样子定义业务状态

StatusOnline int = 0 << iota
StatusOffline
StatusUnknow

这样子就从0开始默认递增。
应该改成如下

StatusOnline int =1 << iota

4. 总结

由于官方文档的简洁,所以可能初用gorm的同学来说容易采坑。这里简单说明一下,这块的经验,希望对你的go编程中能有作用

文章来自个人专栏
数据中间件
5 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0