如何阻止GORM将查询语句中的列名自动转换为小写?
GORM查询列名自动转小写问题解决方案
问题原因
GORM 默认使用的命名策略会自动将查询语句中的标识符(表名、列名)转换为蛇形全小写格式,对于 PostgreSQL 这类对标识符大小写敏感的数据库,如果你建表时通过双引号保留了列名的驼峰格式(如createdAt),就会出现列名不匹配的报错。
解决方案
方案1:全局关闭自动转小写配置
初始化GORM实例时,配置命名策略的NoLowerCase参数为true,全局关闭自动转小写逻辑,适合全库都使用驼峰命名列的场景:
import "gorm.io/gorm/schema" // 初始化DB时添加配置 db, err := gorm.Open(postgres.Open(你的DSN), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ NoLowerCase: true, }, })
配置完成后你原来的查询代码不需要修改即可正常运行。
方案2:单条查询手动保留大小写
如果不想修改全局配置,只需要给单条查询的列名加上双引号包裹,并用gorm.Expr包裹查询条件避免GORM改写:
response := db.Where(gorm.Expr(`"createdAt" BETWEEN ? AND ?`, today, tomorrow)).Find(&orders)
方案3:通过模型标签绑定列名
在定义模型结构体时,通过gorm:"column:xxx"标签显式指定列名,查询时使用结构体字段作为条件,GORM会自动匹配标签指定的列名:
type Order struct { CreatedAt time.Time `gorm:"column:createdAt"` // 其他字段... } // 查询时可直接用字段名构造条件,GORM会自动匹配正确列名 response := db.Where("CreatedAt BETWEEN ? AND ?", today, tomorrow).Find(&orders)
内容的提问来源于stack exchange,提问作者José Mendoza
相关产品推荐
相关产品推荐

