升级到 golang 1.23 版本后,gorm 的 count 统计总是返回 0

更新日期: 2024-11-15 阅读次数: 198 字数: 498 分类: golang

之前为了使用 excelize 的一个新功能, golang excelize 自动解析 excel 单元格的字体颜色, 将 golang 由 1.18 升级到了 1.23。但是遇到了 gorm 的一个 bug。

问题代码

var items []models.Article

db := models.DB.Model(&models.Article{}).
	Preload("Category")

db = db.Session(&gorm.Session{})

db.Order("id desc").
	Limit(limit).
	Offset((page - 1) * limit).
	Find(&items)

var count int64 = 0
db.Count(&count)

问题现象

  • 这个 count 总是返回 0。
  • 而且 debug 日志中,只有 find 对应的查询语句,但是没有 count 对应的 sql 语句。也就是说,并没有执行。
  • 这个问题,在升级到 golang 1.23 版本之后才出现的,之前在 go 1.18 版本中是正常的。

所以,看起来是 gorm 在 golang 1.23 下执行出错了,但是按照 gorm 的尿性,出错都是屁都不放一个。 所以直接跳过了 count 的执行,返回的就是初始值 0。

进一步测试

  • 如果去掉 Preload 的部分,count 是能正常运行的。
  • 加上 Preload 的,count 就是返回 0,并不执行这段逻辑。

版本信息

> go version
go version go1.23.2 linux/amd64

> grep gorm go.mod
gorm.io/datatypes v1.0.6
gorm.io/driver/mysql v1.3.2
gorm.io/gorm v1.23.2

升级 gorm 版本

google 了半天,也看了 github 上 gorm 的相关 issue,有同样的问题反馈,但是没有人答复。

于是想先试试升级 gorm 版本到最新,看看是否可以解决

> go get -u gorm.io/gorm
go: downloading gorm.io/gorm v1.25.12
go: downloading golang.org/x/text v0.20.0
go: downloading golang.org/x/sys v0.5.0
go: downloading golang.org/x/sync v0.9.0
go: upgraded github.com/jinzhu/now v1.1.4 => v1.1.5
go: upgraded golang.org/x/sync v0.0.0-20201207232520-09787c993a3a => v0.9.0
go: upgraded golang.org/x/sys v0.0.0-20211020174200-9d6173849985 => v0.5.0
go: upgraded golang.org/x/text v0.3.7 => v0.20.0
go: upgraded gorm.io/gorm v1.23.2 => v1.25.12
  • v1.25.12 是今年(2024年) 8 月份的最新版本
  • v1.23.2 是 2022 年 3 月的版本

测试

升级后,问题就解决了。。。

看来升级 go 版本,也是非常危险的一件事情,并不是百分百的向下兼容。 特别是 gorm 这种玩意,一定要测试后再发布。

接下来,就得把之前写的一堆 go 项目的 gorm 库升级一遍了 🥲

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式