使用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
相关产品推荐
相关产品推荐

