Rails和Heroku PGError:列不存在

时间:2010-10-10 22:13:36

标签: ruby-on-rails postgresql sqlite heroku

我为我的应用程序开发的这个页面在本地工作正常(使用sqllite3)但是当我将它推送到使用PostgreSQL的Heroku时我得到了这个错误:

  

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

从这行代码:

@photos = Photo.where(["neighborhood = ? AND isUpForConsideration = ?", @neighborhood.id, 1])

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

我也试过了:

@photos = @neighborhood.photos(:conditions => {:isUpForConsideration => 1})

@photos = @neighborhood.photos.where(["isUpForConsideration = 1"])

这给了我这个错误:

  

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

知道我可能做错了吗?

2 个答案:

答案 0 :(得分:18)

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

e.g。

@photos = @neighborhood.photos.where(["\"isUpForConsideration\" = 1"])

答案 1 :(得分:1)

通过修改迁移并将更改推送到Heroku而不重建表来获取此错误的另一种方法。

警告:你会丢失数据和参考资料,所以我要解释的是一个坏主意,除非你确定不会丢失任何引用。 Rails提供了使用迁移修改表的方法 - 创建新的迁移以修改表,一般不要在创建迁移后自行修改。

话虽如此,您可以运行heroku run rake db:rollback,直到您更改的表格弹出,然后运行heroku run rake db:migrate将其更改回来。

此外,您可以使用taps gem来备份和恢复数据。下拉数据库表,按照您需要的方式进行操作,然后用水龙头将表推回。我在原型设计阶段经常这样做。我不会用现场应用程序做到这一点。