1

我在 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) 是一些问题。我的问题是我需要做什么来解决这个问题?是因为我在 find 中调用的标志仅受 SQLite 支持而不是 PostgreSQL 吗?

4

1 回答 1

7

引用标识符的反引号是 SQLite 也支持的 MySQL 主义。引用标识符的标准语法(PostgreSQL 使用的)是使用双引号:

:order => '"order" ASC'

我建议你尽快做两件事:

  1. 将列的名称更改"order"为未保留的名称。
  2. 安装 PostgreSQL 并使用 PostgreSQL 开发是您计划部署到 Heroku。您的开发堆栈应始终与您的部署堆栈完全匹配。

第二点相当重要。数据库可移植性是一个神话,数据库之间存在许多微小差异,以至于编写在多个数据库中工作相同的代码很困难,并且意味着编写自己的可移植层(不,ActiveRecord 不是那个可移植层)。这个小引用问题可能是许多小问题中的第一个。

于 2012-07-13T17:43:42.637 回答