Rails ActiveRecord查询PostgreSQL驼峰列提示不存在如何解决?
问题成因
- PostgreSQL默认对未用双引号包裹的SQL标识符(列名、表名等)会自动转换为全小写,你创建
advertiserName列时使用了驼峰命名且保留了大小写,查询时如果没有给列名加双引号,PostgreSQL就会将其转为advertisername去匹配,自然找不到对应列。 - 下划线命名的列本身就是全小写格式,自动转译后不会出现匹配错误,所以同类下划线列的查询可以正常执行。
- 带表前缀但未给列加双引号的写法也会触发同样的转译规则,因此修改后仍然报错。
解决方案
方案1:给原生SQL中的驼峰列名加双引号
如果要保留原生SQL的写法,直接给驼峰列名包裹双引号即可解决转译问题:
# 基础写法 Listing.where('"advertiserName" LIKE ?', '%lowes%') # 带表前缀的写法 Listing.where('"listings"."advertiserName" LIKE ?', '%lowes%')
该方案无需修改现有表结构,适合快速修复现有查询。
方案2:使用Rails ActiveRecord内置查询语法
使用哈希查询或者Arel语法,Rails会自动处理列名的大小写转义,无需手动编写原生SQL片段:
# Arel写法适配模糊查询场景 Listing.where(Listing.arel_table[:advertiserName].matches('%lowes%'))
该方案更符合Rails开发规范,避免手动处理SQL转义细节。
方案3(长期推荐):统一数据库列名为下划线命名
Rails默认约定数据库字段使用蛇形(下划线)命名,模型层会自动映射为驼峰属性。如果项目还在可调整阶段,可以将advertiserName重命名为advertiser_name,后续所有查询都无需额外处理大小写问题,和项目内其他字段的使用逻辑保持一致。
内容的提问来源于stack exchange,提问作者stevec
相关产品推荐
相关产品推荐

