gorm

大象笔记 > 标签 > gorm

gorm 预加载的使用场景

背景 我正在用 golang gin 写的一个统计人数小程序后台服务涉及两个大数据表 用户表 活动参与的用户表 在查询一个活动参与的所有用户信息时,需要同时用到这两个表。考虑到运营一段时间之后,这两个表的数据量不可控,所有不打算使用联表查询。而采用 先查询活动对应的用户 id 集合 然后 where in ids 来查询对应的用户信息 如果用 golang 手写这个逻辑,还挺啰嗦的。在翻看 gorm 文档时,发现 gorm 支持预加载功能,这个功能类似 laravel eloquent 里的 Eager Loading 功能 (相对于 lazy loading)。 预加载的使用方法 t ...

阅读全文...

GORM 1 升级 GORM 2 的修改点

在写公司内部的一个办公系统时,想趁机把 Gorm 版本升级一下。 大部分靠 go build 的编译错误提示,修改完成。 依赖修改 由 github.com/jinzhu/gorm 变更为 gorm.io/gorm cannot use "mysql" (type string) as type gorm.Dialector in argument to gorm.Open - DB, err = gorm.Open("mysql", dataSourceName) + DB, err = gorm.Open(mysql.Ope ...

阅读全文...

Golang Gorm Error 1292: Incorrect datetime value: '0000-00-00' for column

报错内容 在用 Golang Gorm 更新 MySQL 一条数据时,报错: Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1 UPDATE `repair` SET `created_at`='0000-00-00 00:00:00',`updated_at`='2021-06-03 17:03:31.359' WHERE `id` = 2 报错代码 我是将 Antd Pro Web 管理后台的数据通过 API 接口发送给后台 Golang 接口,进行更新。 由于前端不需要 ...

阅读全文...

golang gorm 2 中使用 lock for update 锁

查了一下 golang gorm 2 确实支持 lock for update。文档: https://gorm.io/zh_CN/docs/advanced_query.html#Locking-FOR-UPDATE db.Clauses(clause.Locking{Strength: "UPDATE"}).Find(&users) 但由于 for update 必须在事务中使用,所以,还需要看看 gorm 事务的写法。 lock for update 与 share 的区别 参考 使用 Laravel sharedLock 与 lockForUpdate 进 ...

阅读全文...

Golang Gorm 数据插入 MySQL 失败 Error 1054: Unknown column 'xx' in 'field list'

原因是,我 Struct 中定义了一个新字段,为了方便在接口返回数据时,能补充一个数据库中没有的信息。 这导致在 Gorm 插入 MySQL 时报错,提示未知字段错误。 插入时,忽略指定字段 查了一下,发现 Gorm 有个字段标签的功能,可以方便的忽略特定字段: https://gorm.io/zh_CN/docs/models.html#%E5%AD%97%E6%AE%B5%E6%A0%87%E7%AD%BE - 忽略该字段,- 无读写权限 甚至可以更细分的控制,读和写分别设置是否忽略。 例如: type User struct { Name string `gorm:"-& ...

阅读全文...

golang gorm 的多对多关系 CRUD 操作

例如,一个财务预算管理系统,需要能设置各部门的负责人,以方便控制查看权限。 而且可以一个部门设置多个负责人。 golang gorm 的数据结构 因为我独立建了个关系表,兼容出现多对多的关系,所以用到了 gorm many2many: type Department struct { Id int `json:"id"` Name string `json:"name"` Managers []User `gorm:"many2many:department_manager;"` Mana ...

阅读全文...

Golang Gorm Sum decimal 字段类型

感觉是 Gorm 的 Bug,在使用 Pluck 获取 Sum 结果时总是报错。 而用 Scan 就没有问题。 可行的做法 Scan type FHSum struct { Total float64 } var total FHSum db.Select("sum(money) as total").Scan(&total) 这样能获取到 sum 的结果。 Pluck float64 报错 var total []float64 // slice 的第一个数字就是 sum 值 db.Select("sum(money) as total&quot ...

阅读全文...

gorm soft delete 的唯一索引问题

bug 今天测试我的添加、修改接口时,发现一个联合唯一索引不生效。 有问题的表结构: CREATE TABLE `card` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `deleted_at` datetime DEFAULT NULL, `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_name_del` ...

阅读全文...

Gorm select 表里所有数据包括已经软删除的数据

又写了一天的 bug ... 被 ORM 折腾死。 没关系,又活了一天,已经很厉害了。。。 Bug 的根源 一个设备信息管理系统的表,里面会自动给设备生成设备 ID。 格式: 前6位为生产如期,如:211207,代表 2021年12月7日生产。 后3位为生产编号,如:001,代表当日生产的第一台设备。 编号的生成逻辑: sql like 取最新的一条 满足 211207 的记录,如果有,就判断最后三位 + 1 没有,就生成一条 001 这个逻辑跑了很久都没有出问题,但是今天在写一个新系统时,我偷懒 copy 过来了。 然后,另一个 bug 导致几条设备信息被软删除 (gorm 默认是使 ...

阅读全文...

gorm preload 限制 field 字段

例如,我想用 golang gorm 查询订单表中关联的代理商名称,但是用 Gorm Preload 又会将代理商信息中多余的敏感信息取出来, 例如联系人等信息。于是就需要限制 Preload 的返回字段。 Models type Order struct { gorm.Model AgentId int // 代理商 id Agent Agent // 代理商信息 Status int } type Agent struct { gorm.Model Name string // 代理 ...

阅读全文...