1

PostgreSQLデータベースにクエリを実行しようとすると、以下のエラーが発生します。pgAdminでテーブルとすべての列を表示でき、select *を実行することもできるので、テーブルと列が存在することがわかります。これに関するどんな助けも大いに感謝されるでしょう。

これが私が得ているエラーです:

PG::Error: ERROR:  column "fi_ase" does not exist

問題のテーブルのスキーマは次のとおりです。Rails3.2アプリの一部として移行して生成されました。

create_table "certificates", :force => true do |t|
  t.integer  "profile_id"
  t.boolean  "FI_ASE"
  t.boolean  "FI_AME"
  t.boolean  "FI_INSTA"
  t.datetime "created_at",    :null => false
  t.datetime "updated_at",    :null => false
  t.boolean  "C_ASEL"
  t.boolean  "C_AMEL"
  t.boolean  "C_ASES"
  t.boolean  "C_AMES"
  t.boolean  "ATP_ASEL"
  t.boolean  "ATP_AMEL"
  t.boolean  "ATP_ASES"
  t.boolean  "ATP_AMES"
  t.boolean  "GI_Basic"
  t.boolean  "GI_Advanced"
  t.boolean  "GI_Instrument"
end

Railsでの私のクエリ/メソッドは次のとおりです。

def self.search(city, state, zip, *certs)
  query_obj = joins(:profile => [:addresses, :certificate])
  query_obj = query_obj.where("city like ?", "%#{city}%") unless city.blank?
  query_obj = query_obj.where("state = ?", state) unless state.blank?
  query_obj = query_obj.where("zip like ?", "%#{zip}%") unless zip.blank?
  query_obj = query_obj.where("FI_ASE = ?", true) unless certs[0].blank?

  query_obj
end

次のSQLステートメントをpgAminSQLエディターで直接実行すると、同じエラーが発生します。

select *
from contacts c
inner join profiles p on c.id = p.contact_id
inner join addresses a on p.id = a.profile_id
inner join certificates ct on p.id = ct.profile_id
where ct.FI_ASE = true
4

1 に答える 1

3

Rails は、列名を生成するときに列名を二重引用符で囲みます。たとえば、テーブルの CREATE TABLE は、PostgreSQL が認識すると次のようになります。

create table "certificates" (
  -- ...
  "FI_ASE" boolean,

識別子が二重引用符で囲まれている場合、大文字と小文字が区別されます。しかし、PostgreSQL は引用符で囲まれていない識別子を小文字に正規化するため、次のように言うと:

query_obj.where("FI_ASE = ?", true)

SQLは次のようになります。

where FI_ASE = 't'

ただし、 yourFI_ASEは引用されていないため、PostgreSQL は次のように認識します。

where fi_ase = 't'

ただし、テーブルにはfi_ase列がなく、列がありFI_ASEます。

何が問題なのかがわかったところで、どうすれば修正できるでしょうか。常に列名を手動で引用できます。

where('"FI_ASE" = ?', true)

または、ActiveRecord に実行させることもできます (ただし、正しいケースを使用するようにしてください)。

where(:FI_ASE => true)

または、何よりも、小文字の列名を使用してテーブルを再作成し、引用符を付ける必要がないようにします。

于 2013-01-30T06:16:12.087 に答える