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

文章目录

    之前为了使用 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式