【问题标题】:Rails and Heroku PGError: column does not existRails 和 Heroku PGError:列不存在
【发布时间】:2011-04-23 13:53:31
【问题描述】:

我一直在为我的应用程序开发的这个页面在本地运行良好(使用 sqllite3)但是当我将它推送到使用 PostgreSQL 的 Heroku 时,我收到了这个错误:

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])

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

知道我做错了什么吗?

【问题讨论】:

    标签: ruby-on-rails postgresql sqlite heroku


    【解决方案1】:

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

    警告:您将丢失数据和可能的引用,所以我要解释的是一个坏主意,除非您确定不会丢失任何引用。 Rails 提供了通过迁移来修改表的方法——创建新的迁移来修改表,通常在创建后不要修改迁移本身。

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

    此外,您还可以使用 taps gem 来备份和恢复数据。拉下数据库表,按照您需要的方式调整它们,然后用水龙头将表推回。我在原型设计阶段经常这样做。不过,我绝不会在实时应用中这样做。

    【讨论】:

      【解决方案2】:

      你的问题是table and column names are case sensitive in PostgreSQL。这通常通过在进行查询时自动将它们转换为全小写来隐藏(因此您会看到报告“isupforconsideration”的错误消息),但如果您设法在创建时避开该转换(通过双引号名称,就像 Rails 为当你创建一个表时),你会看到这种怪异。在 WHERE 子句中使用“isUpForConsideration”时,需要用双引号将其括起来以解决此问题。

      例如

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

      【讨论】:

      • 我现在可以吻你。我一直在用头撞墙,答案很简单“当你在 WHERE 子句中时,双引号这个混蛋”!为你点赞……为你点赞一百万!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2011-06-03
      • 2012-04-27
      • 1970-01-01
      • 2023-03-13
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多