6

WHERE現在、Railsを使用してテーブルで複雑な検索を実行しようとしていますが、問題は次のエラーが発生することです。

PG::Error: ERROR:  column "email" does not exist
LINE 1: SELECT "bans".* FROM "bans"  WHERE (Email='' AND IP='' AND (...
                                        ^
: SELECT "bans".* FROM "bans"  WHERE (Email='' AND IP='' AND (Username='NULL' ))

そして、私は列が実際に存在することを知っています、そしてそれをすることrails dbconsoleは私に次のことを与えます:

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

それで、これは間違いなくデータベースにあります、誰かがこれを経験したことがありますか?

4

3 に答える 3

12

SQLの列名は、引用符で囲まれていない限り大文字と小文字を区別しません。標準では、識別子は大文字に正規化する必要がありますが、PostgreSQLは小文字に正規化する必要があります。

識別子を引用すると大文字と小文字が区別されますが、引用符で囲まれていない名前は常に小文字になります。たとえば、識別子FOO、、、fooおよびは"foo"PostgreSQLによって同じであると見なされますが、これら3つ"Foo"および"FOO"互いに異なります。(PostgreSQLで引用符で囲まれていない名前を小文字に折りたたむことはSQL標準と互換性がありません。つまり、引用符で囲まれていない名前は大文字に折りたたむ必要があります。したがって、標準に従わないfooことと同等である必要があります。ポータブルアプリケーションを作成する場合は、常に特定の名前を引用するか、決して引用しないことをお勧めします。)"FOO""foo"

SQLで参照Emailしています:

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

しかし、PostgreSQLは次のことについて不平を言っていますemail

column "email" does not exist

引用符で囲まれていないものは、PostgreSQLが識別子を小文字に正規化するためEmailとして扱われます。email大文字の名前で列を二重引用符で囲んで作成したようです。

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

または、を使用:Emailして移行の列を識別します。列名を作成時に引用符で囲むと、小文字(またはSQL標準の場合は大文字)に正規化されないため、二重引用符で囲み、大文字と小文字を完全に一致させる必要があります。

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

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

ベストプラクティスは、小文字の列名とテーブル名を使用することです。これにより、常に引用符で囲む必要がなくなります。小文字の列名を持つようにテーブルを修正することをお勧めします。


余談ですが、'NULL'文字列リテラルは次のとおりです。

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

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

于 2012-05-17T02:23:31.383 に答える
1

エラーがテストデータベースからのものであるようには見えませんが、そうである場合は試してみてくださいrake db:test:prepare

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

于 2012-05-17T02:10:03.070 に答える
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])

列名を囲む「」記号に気づきましたか?まあ..それは迷惑ですが、それがこの問題の修正です。

于 2015-04-15T16:24:01.913 に答える