在Ruby on Rails(MySQL)中使用'end'作为列名



我有一个带有"end"列(日期时间格式)的模型,结果发现每当我试图在查询中引用该列时,Heroku就会崩溃并因不合逻辑的Active Record错误而崩溃。我花了两个小时调试这个极其简单的查询,之后我将列重命名为"end_at",所有问题都消失了。

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

BEGIN和END在Oracle和SQL Server中是保留字,但不确定为什么MySQL不将它们视为保留字

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

保留字(和包含空格的名称)可以在引号中使用-可能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

PostgresQL (Heroku使用的)保留END作为关键字,所以它会给你一个语法错误,因为你的语法不正确。

有两个选项可以修复:

如果Heroku因为ActiveRecord没有引用列名而崩溃,你可以重写每个使用该模型的查询,以显式引用"end"列,这样PostgresQL就不会爆炸。

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

最新更新