3

geolite_blocks というテーブルを持つ Postgres データベースを使用する Rails アプリがあります。次のように ActiveRecord を呼び出すと:

GeoliteBlock.find_by_startIpNum 2776360991

クエリは完全に機能します。ただし、次のようなクエリを実行すると:

GeoliteBlock.where("startIpNum >= ?", 2776360991)

次のエラーが表示されます。

ActiveRecord::StatementInvalid: PGError: ERROR:  column "startipnum" does not exist
LINE 1: ... "geolite_blocks".* FROM "geolite_blocks"  WHERE (startIpNum...
                                                             ^
: SELECT "geolite_blocks".* FROM "geolite_blocks"  WHERE (startIpNum >= 2776360991)

しかし、最初のコード例でクエリを実行しただけなので、列が存在することはわかっています。なぜこれが起こっているのか、どうすればそれを排除できるのかについてのアイデアはありますか? 助けてくれてありがとう!

4

1 に答える 1

6

SQL の列名は、作成時に引用されていない限り、大文字と小文字が区別されません。誰かがあなたのstartIpNum列を引用符で囲んで作成したので、使用するたびに引用する必要があります:

GeoliteBlock.where('"startIpNum" >= ?', 2776360991)

PostgreSQL が識別子を小文字に正規化するため、PostgreSQLから取得しているエラーが言及startipnumされています (ただし、SQL 標準では、大文字に正規化する必要があるとされています)。

これ:

GeoliteBlock.find_by_startIpNum 2776360991

ARがstartIpNuMあなたの後ろの部分を引用するので機能します。同様に、GeoliteBlock.where(:startIpNum => 2776360991)動作します。

もうこれについて心配する必要がないように、小文字の列名を使用するようにスキーマを変更することをお勧めします。

于 2012-03-19T06:52:24.383 に答える