3

我有一个使用 Postgres 数据库和一个名为 geolite_blocks 的表的 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 得到的错误提到startipnum,因为 PostgreSQL 将标识符规范化为小写(尽管 SQL 标准说它们应该规范化为大写)。

这:

GeoliteBlock.find_by_startIpNum 2776360991

有效,因为 AR 会引用startIpNuM你背后的部分。同样,GeoliteBlock.where(:startIpNum => 2776360991)也可以。

我建议您更改架构以使用小写的列名,这样您就不必再担心这个问题了。

于 2012-03-19T06:52:24.383 回答