我已经在 Heroku 上安装了一个在本地运行良好的应用程序(在测试中使用 sqlite3 作为数据库的 gem),当我推送到 Heroku 并尝试运行它时,我不断收到此错误:
ActiveRecord::StatementInvalid (PG::Error: ERROR: syntax error at or near "order"
LINE 1: ...lery_url_id = 'k19fv2mytjEb_3gCezLeRA') ORDER BY `order` ASC ^
: SELECT "pictures".* FROM "pictures" WHERE (gallery_url_id = 'k19fv2mytjEb_3gCezLeRA') ORDER BY `order` ASC):
app/controllers/galleries_controller.rb:38:in `show'
特别是这一行:
@pictures = Picture.find(:all, :conditions => [ 'gallery_url_id = ?', @gallery.url_id ], :order => "`order` ASC")
注意:order 是一个数据库字段,而不是 SQL 调用或引用。所以不要告诉我我正在执行两个命令。那将是愚蠢的。除非以某种方式解析它。这也很愚蠢。
我了解到在本地测试中使用 SQLite 并在生产环境中使用 PostgreSQL (pg) 存在一些问题。我的问题是我需要做什么来解决这个问题?是否由于我在查找中调用的标志仅受 SQLite 而不是 PostgreSQL 支持?
最佳答案
用于引用标识符的反引号是 SQLite 也支持的 MySQL 主义。引用标识符的标准语法(PostgreSQL 使用)是使用双引号:
:order => '"order" ASC'
我建议您尽快做两件事:
- 将
“order”
列的名称更改为非保留名称。 - 如果您计划部署到 Heroku,请安装 PostgreSQL 并使用 PostgreSQL 进行开发。您的开发堆栈应始终与您的部署堆栈完全匹配。
第二点相当重要。数据库可移植性是一个神话,数据库之间存在如此多的细微差异,以至于编写在多个数据库中工作相同的代码很困难,并且意味着编写您自己的可移植层(不,ActiveRecord 不是那个可移植层)。这个小引用问题可能是许多小问题中的第一个。
关于ruby-on-rails-3 - Heroku + Rails + PostgreSQL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11475459/