【问题标题】:Rails and Heroku PGError: column does not exist for where argumentRails 和 Heroku PGError:where 参数的列不存在
【发布时间】:2013-02-20 18:49:04
【问题描述】:

我四处搜索,发现了一些类似的搜索,但没有一个真正详细说明我遇到的问题,所以我想我会分享我的发现。

问题
在将 Ruby on Rails 项目推送到 Heroku(DB = PostgresQL)时,我遇到了一些在开发环境中没有收到的错误(DB = SQLite)。 p>

详情
我有一个模型,比如Message,它与owner 具有多态关联,它可以是UserCustomer(这些不是实际模型,所以 不要问为什么有一个多态关联,因为它显然类似于 User 模型中的布尔值 customer 列)。

当使用ActiveRecord 查询数据库时,我在Message 模型中有一个方法,它检索与某个User 关联的消息(重要的是要注意,在owner 的多态关联中,在在这种情况下,Message 模型将添加两列,owner_idowner_type,其中 owner_type 将是 UserCustomer)

方法定义如下:

    def self.getMessagesForUser(user)
      message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \"User\""
      where("message_id IN (#{message_ids})", user_id: user.id)
    end

如您所见,message_ids 字符串被定义为可以轻松插入模型的where 方法中(提示:这就是问题所在)。

错误
我收到了以下错误:

    ActionView::Template::Error (PGError: ERROR:  column "Customer" does not exist)

我知道有些地方出了问题,因为该论点被视为一个列,所以我做了一些修改并找到了解决方案。

解决方案
我没有意识到在查询中使用单引号或双引号时,某些查询语言(如 SQL、PostgresQL 等)不像 SQLite 那样宽容。具体来说,PostgreSQL 不支持查询中的双引号,即 message_ids 字符串中 owner_typeUser 参数!我只是将方法中的行从:

    message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \"User\""

到:

    message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \'User\'"

更简单地说:

"User" needed to be 'User'

事情进展顺利。

【问题讨论】:

  • 拒绝分享知识 - 感谢 SO 社区的支持。如果您碰巧现在正在阅读本文并计划对某些内容投反对票,请提供一些关于您认为该问题“不值得”的为什么的解释。至于这个问题,我认为有趣的是所呈现的错误令人困惑,即当“客户”甚至没有作为数据库中的列提供时,它说“客户”列不存在,只是作为一个值对于owner_type。我认为知道如何将奇怪的错误映射到其根本原因总是值得分享的。
  • @MadM 赞成。遇到同样的问题,这对我有帮助

标签: ruby-on-rails sqlite postgresql heroku rails-activerecord


【解决方案1】:

解决方案
我没有意识到在查询中使用单引号或双引号时,某些查询语言(如 SQL、PostgresQL 等)不像 SQLite 那样宽容。具体来说,PostgreSQL 不支持查询中的双引号,即 message_ids 字符串中 owner_typeUser 参数!我只是将方法中的行从:

    message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \"User\""

到:

    message_ids = "SELECT owner_id FROM messages WHERE owner_id = :user_id AND owner_type = \'User\'"

更简单地说:

"User" needed to be 'User'

事情进展顺利。

【讨论】:

  • 标准 SQL 不喜欢字符串的双引号。 SQL 对字符串使用单引号,对标识符使用双引号。 MySQL 使用反引号作为标识符并允许对字符串使用双引号,SQLite (AFAIK) 允许在任何地方使用任何类型的引号。如果您要部署到 PostgreSQL,请停止在 SQLite 之上进行开发,引用将是最不用担心的。 Rails 人默认使用 SQLite 是一个愚蠢的决定,您不必为他们缺乏远见而受苦。
  • @muistooshort,也许这在另一个问题或SO外部的东西中有所涉及,但有没有解释为什么SQLite如此令人憎恶?到目前为止,这是我从开发移植到生产时遇到的唯一问题 - 这似乎是个人意见/或几乎是仇杀(我希望这不是投反对票的原因)。无论哪种方式,我都会编辑我的答案以包含您提供的一些内容 - 谢谢!
  • Abomination 有点强,SQLite 是一个很棒的工具。我想到了一些问题:松散的类型系统(例如,您可以将字符串放在数字列中而不会抱怨),没有日期或时间类型以及 SQLite 特定的字符串操作函数来伪造它们,非标准的引用行为,非标准GROUP BY 行为。如果您寻找“在开发中工作,在 Heroku 失败”的问题(数量众多),您会看到一些问题。你看到的任何反对票都是来自其他人的。
猜你喜欢
  • 2011-04-23
  • 2015-11-01
  • 2016-02-18
  • 2021-07-06
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多