Heroku + Rails + PostgreSQL问题

use*_*511 1 postgresql heroku ruby-on-rails-3

我已经在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'
Run Code Online (Sandbox Code Playgroud)

特别是在这一行:

@pictures = Picture.find(:all, :conditions => [ 'gallery_url_id = ?', @gallery.url_id ], :order => "`order` ASC")
Run Code Online (Sandbox Code Playgroud)

注意:order是数据库字段,而不是SQL调用或引用.所以不要告诉我我正在做两个订单.那太傻了.除非以某种方式解析它.哪个也很傻.

我知道在本地测试中使用SQLite和在生产环境中使用PostgreSQL(pg)是一个问题.我的问题是我需要做些什么来解决这个问题?是否由于我在find中调用的标志只支持SQLite而不支持PostgreSQL?

mu *_*ort 7

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

:order => '"order" ASC'
Run Code Online (Sandbox Code Playgroud)

我建议你尽快做两件事:

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

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

  • 根据我的经验,在SQLite和Postgres之间进行是特别困难的.SQLite有很多奇怪的小问题,特别是在列类型方面,Postgres对类型非常严格. (2认同)