You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GoRM查询MySQL表最大值返回0的问题求助

问题解决:GORM查询MAX值返回0的原因及修复

核心问题:结构体字段未导出

你的代码中定义的匿名结构体字段presentation_pk是小写开头,在Go语言中这属于包私有字段,GORM作为外部包无法通过反射访问并赋值该字段,因此查询结果无法写入,始终显示默认值0。

修复代码

将结构体字段改为首字母大写(导出字段),配合gorm:"column:presentation_pk"标签映射数据库列:

var newPrsPk struct {
    PresentationPk int `gorm:"column:presentation_pk"`
}
db.Raw("select max(presentation_pk) as presentation_pk from presentation").Scan(&newPrsPk)

log.Println(newPrsPk)
log.Println(newPrsPk.PresentationPk)

额外优化:无需查询MAX,直接获取自增ID

你提到在Create()后需要获取自增字段,其实GORM支持在创建数据后自动填充自增ID到结构体中,不需要额外查询MAX:

// 假设你的表对应结构体是Presentation
type Presentation struct {
    PresentationPk int `gorm:"column:presentation_pk;primaryKey;autoIncrement"`
    // 其他字段...
}

var prs Presentation
// 填充prs的其他字段后执行创建
if err := db.Create(&prs).Error; err != nil {
    // 处理创建错误
}
// 创建完成后,prs.PresentationPk就是刚生成的自增ID
log.Println("自增ID:", prs.PresentationPk)

事务相关注意事项

如果你的Create()操作是在事务中执行的,必须确保事务已提交,否则数据库中不会存在新数据,查询MAX自然得不到正确结果:

tx := db.Begin()
defer func() {
    if r := recover(); r != nil {
        tx.Rollback()
    }
}()

if err := tx.Create(&prs).Error; err != nil {
    tx.Rollback()
    // 处理错误
}

if err := tx.Commit().Error; err != nil {
    // 处理提交错误
}

内容的提问来源于stack exchange,提问作者rasellers0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:25:13