Rails和Heroku PGError:列不存在

4

我一直在为我的应用程序开发这个页面,本地使用sqllite3时一切正常,但当我将其推送到使用PostgreSQL的Heroku时,出现以下错误:

NeighborhoodsController#(ActionView :: Template :: Error)“PGError:ERROR:列”isupforconsideration“不存在\nLINE 1:...“photos”WHERE(neighborhood = 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\" does not exist\nLINE 1: ...tos\" WHERE (\"photos\".neighborhood = 52) AND (isUpForCon...\n

您有任何想法是我做错了什么吗?

2个回答

18
你的问题在于在PostgreSQL中表和列名区分大小写。通常,在进行查询时将这些自动转换为全小写,这样就隐藏了这个问题(因此您看到错误消息报告“isupforconsideration”),但是如果您在创建时成功避免了此转换(通过双引号引用名称,就像Rails在创建表时为您所做的那样),您将看到这种奇怪的情况。在使用WHERE子句时,需要用双引号括起来"isUpForConsideration"以修复此问题。

例如:

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

2
我现在真想亲你一口。我花了这么多时间在墙上撞头,结果答案竟然是一个简单的“当你在WHERE子句中时,给那个混蛋加上双引号”!给你点赞...给你一百万个赞! - The One Rob

1

另一种导致此错误的方法是修改迁移并将更改推送到Heroku而不重新构建表。

注意:您将丢失数据和可能的引用,因此,除非您确定不会丢失引用,否则我要解释的内容是一个坏主意。Rails提供了使用迁移修改表的方法-创建新的迁移以修改表,不要在创建后修改迁移本身。

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

此外,您可以使用taps gem备份和恢复数据。下载数据库表,按照需要进行处理,然后使用taps将表推回。在原型设计阶段,我经常这样做。但我永远不会在实时应用程序中这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接