2012-05-17 4 views
6

私は現在のRailsを使用してテーブルの上に複雑なWHERE検索を実行しようとしていますが、トラブルが、私はエラーを取得されている列を見つけることができません実際に存在する、とrails dbconsoleを行うことは私に次のようになります:Railsの報告がある

Jungle=> select * from bans; 
id | Username | IP | Email | Reason | Length | created_at | updated_at 
----+----------+----+-------+--------+--------+------------+------------ 
(0 rows) 

だから、これはデータベースに間違いなくある、誰もがこれでの経験がありましたか?

+3

大文字小文字を区別するカラム名を持つポストグルを使用していますか? –

+0

SQLとテーブルではケースはまったく同じです – nekosune

+0

ええ、それは1つの場所にありますそれは欠けていると言われています。 –

答えて

12

SQLの列名が引用されない限り、大文字と小文字を区別しない、標準の識別子は大文字が、PostgreSQL normalizes to lower caseに正規化されるべきであると述べていますPostgreSQLはemailについて文句を言っています:

column "email" does not exist 

あなたの引用符なしのEmailは、PostgreSQLが識別子を小文字に正規化するため、emailと扱われています。

create table "bans" (
    "Email" varchar(...) 
    ... 
) 

または移行で列を識別するために:Emailを使用して:あなたは、二重にそれらを引用することによって大文字の名前で列を作成したような音。あなたはそれが作成された列名を引用した場合、それは下部ケース(またはSQL標準の場合は大文字)に正規化されていない、あなたはそれを引用倍にする必要があり、永遠ケースと一致します:

SELECT "bans".* FROM "bans" WHERE ("Email"='' ... 

Emailを修正すると、IP,Username,ReasonおよびLengthと同じ問題が発生します。それらを参照するすべてのSQLでは、それらをすべて二重引用符で囲む必要があります。

小文字の列名とテーブル名を使用することをお勧めします。これにより、常に引用文を心配する必要はありません。小文字の列名を使用するようにテーブルを修正することをお勧めします。余談として


、あなたの'NULL'文字列リテラル:

SELECT "bans".* FROM "bans" WHERE (Email='' AND IP='' AND (Username='NULL')) 
-- -------------------->------------------>---------->---------------^^^^^^ 

は奇妙に見える、あなたが"Username" is nullを意味していないことを確信していますか? 'NULL'文字列リテラルとNULL値は全く異なるもので、=または!=を使用してNULLと比較することはできません.is null, is not null, is distinct from, or is not distinct from(意図に応じて)NULLを使用する必要があります。

+0

ありがとう、それはまさに問題でした、私はちょうど標準レールを使用してモデルなどを生成しました、これは私が書き直して、今私のDBデザインの文書全体を再印刷する必要があるということです!とにかくあなたの助けをありがとう。 – nekosune

+0

@nekosune:おそらく、これらの木をすべて殺す罪は、あなたがこの間違いを未然に防ぐのに役立ちます:) –

+0

私は木のために申し訳ありません、私はできる前に、この奇妙な行動によって引き起こされる余分な仕事はそれを必要とします。 – nekosune

1

テストデータベースからのエラーではありませんが、もしそうなら、rake db:test:prepareを試してみてください。

通常、テスト、開発、制作の3つのデータベースがあることに注意してください。したがって、それらを混ぜて間違ったものをチェックするのは簡単です。

SELECT "bans".* FROM "bans" WHERE (Email='' ... 

:あなたのSQLにEmailを参照している

Quoting an identifier also makes it case-sensitive, whereas unquoted names are always folded to lower case. For example, the identifiers FOO , foo , and "foo" are considered the same by PostgreSQL, but "Foo" and "FOO" are different from these three and each other. (The folding of unquoted names to lower case in PostgreSQL is incompatible with the SQL standard, which says that unquoted names should be folded to upper case. Thus, foo should be equivalent to "FOO" not "foo" according to the standard. If you want to write portable applications you are advised to always quote a particular name or never quote it.)

を:

+0

開発DBからのものです。 – nekosune

1

私は、ここに

を同じ問題を抱えていたが、mu-is-too-shortは、PostgreSQLは、列名の大文字と小文字の区別を 検索に伝えることができ、言ったように。

だから私はあなたが直面している同じエラーを回避するために管理実装このコードによって:

Transaction.find(:all,:conditions => ["(date between ? and ?) AND \"Membership_id\" = ?", Time.now.at_beginning_of_month, Time.now.end_of_month,membership.id]) 

は、列名をsrrounding記号「\ に気づいたことがあるまあ..迷惑などとして、?これはこの問題の修正です

関連する問題