1

ローカルで正常に実行されているアプリを Heroku に配置しました (テストでデータベースの gem として sqlite3 を使用)。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 呼び出しや参照ではありません。ですから、私が 2 つの注文をしているとは言わないでください。それはばかげているでしょう。どういうわけかそれがそのように解析されていない限り。これもばかげているでしょう。

ローカル テストで SQLite を使用し、運用環境で PostgreSQL (pg) を使用することによる問題であることは理解しています。私の質問は、これを修正するために何をする必要がありますか? PostgreSQL ではなく SQLite でのみサポートされている検索で呼び出すフラグが原因ですか?

4

1 に答える 1

7

識別子を引用するためのバッククォートは、SQLite もサポートする MySQL-ism です。識別子を引用するための標準的な構文 (PostgreSQL が使用する) は、二重引用符を使用することです。

:order => '"order" ASC'

できるだけ早く次の 2 つのことを行うことをお勧めします。

  1. "order"列の名前を予約されていない名前に変更します。
  2. Heroku へのデプロイを計画している場合は、PostgreSQL をインストールして PostgreSQL を使用して開発します。開発スタックは、常に展開スタックと正確に一致する必要があります。

2 番目の点は非常に重要です。データベースの移植性は神話です。データベース間には非常に多くの小さな違いがあるため、複数のデータベースで同じように機能するコードを記述することは困難であり、独自の移植性レイヤーを作成することを意味します (いいえ、ActiveRecord はその移植性レイヤーではありません)。この小さな引用の問題は、おそらく多くの小さな問題の最初のものになるでしょう。

于 2012-07-13T17:43:42.637 に答える