【问题标题】:Using 'end' as column name in Ruby on Rails (MySQL)在 Ruby on Rails (MySQL) 中使用“end”作为列名
【发布时间】:2011-07-31 01:23:21
【问题描述】:

我有一个带有“结束”列(日期时间格式)的模型,但当我尝试在查询中引用该列时,却发现 Heroku 崩溃并出现不合逻辑的 Active Record 错误。我花了两个小时尝试调试这个极其简单的查询,然后我将该列重命名为“end_at”,我的所有问题都消失了。

还有其他人遇到过这个问题吗?我很好奇这背后的原因,并希望我们可以帮助其他人避免同样的错误。有人问过before 类似的问题,但没有给出明确的答案。

【问题讨论】:

  • 您遇到了什么“不合逻辑”的错误?此外,您似乎已经回答了您自己的问题(通过重命名专栏)——您要问的问题是“其他人遇到过这个问题吗?”
  • @Brett 是的,我找到了问题所在,但此时我对原因更感兴趣。我想知道为什么名为“end”的列会导致此类错误。错误是ActiveRecord::StatementInvalid (PGError: ERROR: syntax error at or near "end",这是不合逻辑的,因为我的语法是正确的。
  • 在 php 中你会尝试命名一个变量或列 <?array_walk 吗?对我来说,为什么要避免命名类 class 或模块 moduleKernel:: 似乎非常明显。此外,PGError 意味着 Postgres 数据库抛出了 Rails 重新抛出的错误,因此您可以处理它。实际上,您遇到的“不合逻辑” ActiveRecord 错误是 SQL 中的语法错误,因为您将列命名为保留字(很可能)或错误地构造了查询(不太可能但可能)。
  • @Brett Bender,有效点(我永远不会在数据库优先设计中这样做),但 ActiveRecord 在生成 SQL 时不应该引用标识符吗?当我针对 SQL Server 进行代码生成时,我防御性地使用 [] 正是为了这个目的(谁知道是否有人用空格或奇数字符命名了列)
  • @Cade Roux 不知道为什么 activerecord 没有引用它的 sql 输出,原来的提问者根本没有发布任何代码,所以我们所能做的就是推测。查询可能都是手写的,并且原始开发人员错误地忘记引用该列,因为他们的最后一个数据库不在乎。也有可能真的是 ActiveRecord 的错(尽管我敢打赌,可能性比开发人员的错误要小)。

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


【解决方案1】:

PostgresQL(Heroku 使用)reserves END as a keyword,所以它给你一个语法错误,因为你的语法不正确。

有两种修复方法:

如果 Heroku 因 ActiveRecord 未引用列名而中断,您可以重写使用该模型的每个查询以显式引用“end”列,这样 PostgresQL 就不会崩溃。

ActiveRecord 是否在默认情况下引用该列名称,将列重命名为更具描述性的名称(end_time、end_date 等),并且在您编写应用程序的语言中也不是保留字,也不是保留字您正在使用的 SQL 引擎。

【讨论】:

    【解决方案2】:

    BEGIN 和 END 是 Oracle 和 SQL Server 中的保留字,但不确定为什么 MySQL doesn't consider them as such

    然而,PGError 似乎表明数据库引擎本身(而不是任何与 Ruby 相关的运行时)确实因为“结束”而拒绝了查询。

    如果引用,可以使用保留字(和包含空格的名称) - 也许 Active Record 没有引用生成的 SQL 中的标识符。

    我会查看 MySQL (http://dev.mysql.com/doc/refman/5.5/en/query-log.html) 中的日志并查看生成的语句。

    因为 PGError 表示 PostGreSQL 而你提到 Heroku (PostgreSQL 8.3) - 我认为这是因为 END 确实是 PostgreSQL 中的保留字:http://www.postgresql.org/docs/8.3/static/sql-keywords-appendix.html

    http://www.petefreitag.com/tools/sql_reserved_words_checker/?word=end

    【讨论】:

    • 真的。不方便的是,它允许您首先使用该列名创建一个表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2013-08-04
    • 1970-01-01
    • 2013-02-01
    • 2010-12-07
    • 2021-08-03
    相关资源
    最近更新 更多