Rails和Heroku PGError:列不存在

dpi*_*eri 4 sqlite postgresql ruby-on-rails heroku

这页我一直在开发我的应用程序已在本地工作的罚款(使用sqllite3),但是当我把它推到Heroku的,它使用PostgreSQL的我得到这个错误:

NeighborhoodsController#(ActionView :: Template :: Error)"PGError:ERROR:column \"isupforconsideration \"不存在\nLINE 1:... \"photos \"WHERE(neighborhood = 52 AND isUpForCon ... \n

从这行代码:

@photos = Photo.where(["neighborhood = ? AND isUpForConsideration = ?", @neighborhood.id, 1])
Run Code Online (Sandbox Code Playgroud)

isUpForConsideration是Photo专栏的一部分.我的所有迁移都是最新的,当我在本地拉回数据库时,isUpForConsideration仍然存在,并且应用程序仍可在本地运行.

我也尝试过:

@photos = @neighborhood.photos(:conditions => {:isUpForConsideration => 1})
Run Code Online (Sandbox Code Playgroud)

@photos = @neighborhood.photos.where(["isUpForConsideration = 1"])
Run Code Online (Sandbox Code Playgroud)

这给了我这个错误:

NeighborhoodsController#(ActionView :: Template :: Error)"PGError:ERROR:column \"isupforconsideration \"不存在\nLINE 1:... tos \"WHERE(\"photos \".neighborhood = 52)AND(isUpForCon ... \n

知道我可能做错了吗?

Con*_*ler 18

您的问题是PostgreSQL中的表和列名称区分大小写.这通常是通过在进行查询时自动将这些转换为全小写来隐藏的(因此,为什么您会看到报告"isupforconsideration"的错误消息),但是如果您设法在创建时避免转换(通过双引号,就像Rails那样)当你创建一个表格时,你会看到这种古怪.在WHERE子句中使用它时,您需要在双引号中包含"isUpForConsideration"来修复此问题.

例如

@photos = @neighborhood.photos.where(["\"isUpForConsideration\" = 1"])
Run Code Online (Sandbox Code Playgroud)

  • 我现在就可以吻你。我一直把头撞在墙上,答案很简单,“当你在 WHERE 子句中时,双引号这个混蛋”!为您点赞……为您点赞一百万! (2认同)