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

时间:2011-04-06 17:51:40

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

有两种方法可以解决它:

如果Heroku因为ActiveRecord没有引用列名而破坏,您可以重写使用该模型的每个查询以明确引用“结束”列,以便PostgresQL不会爆炸。

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