0

私は PostgreSQL を使用していますが、クエリで選択する必要があるパラメーターの引用がない理由がよくわかりません。例を次に示します。「モーター」テーブルに「グループ」という名前のフィールドがあります。そして今、私がしようとすると

Motor.select("group")

出力には次のエラーが含まれます。

  Motor Load (0.5ms)  SELECT group FROM "motors"
  PG::SyntaxError: ERROR:  syntax error at or near "group"
  LINE 1: SELECT group FROM "motors"

「group by」コマンドのようなものと競合しない名前の異なるフィールドに対する同じコマンドは完璧に機能します。

周りに引用符がいくつかあるはずではありませんか?それとも、そのための設定で何かを見逃したのでしょうか?

助けてください!

PS

次のように、実際にテーブルの行を正確に選択できることがわかりました。

Motor.select("motors.group")

しかし、それは私には良くてきれいではないようです..

4

1 に答える 1

1

ActiveRecord に文字列を渡した場合:

Motor.select('group')

次に、その文字列をそのまま使用します。そうしないselectと、AR が理解できないものを通話で使用できなかったり、AR が文字列を解析して、実際の意味を理解しようとしたりする必要があります。これらのアプローチはどちらも非常に問題があります。

残念ながら、select他のものを渡すと、単純なto_s呼び出しを使用して引数を文字列に変換することになり、最初のケースに戻るため、次のようには言えません。

Motor.select(:group)

賢明なSQLを取得するために。AR は場合によっては識別子を自動的に引用しますが、ここでは引用しません。

短期的な解決策は、問題の識別子を手動で引用することです。

Motor.select('"group"')

二重引用符は、キーワードとして解釈されるのを防ぎgroupます。大文字と小文字も保持されるため、注意が必要です。二重引用符は識別子を引用する標準的な方法ですが、MySQL はバッククォートを使用し、他のデータベースは別のものを使用します。

本当の解決策は、列またはテーブルの名前としてキーワードを使用しないようにし、group列の名前を別の名前に変更して、この問題が発生しないようにすることです。

于 2013-08-29T15:42:17.060 に答える