dsh*_*per 2 postgresql activerecord ruby-on-rails rails-postgresql
我有一个使用Postgres数据库的Rails应用程序,其中有一个名为geolite_blocks的表.如果我像这样调用ActiveRecord:
GeoliteBlock.find_by_startIpNum 2776360991
Run Code Online (Sandbox Code Playgroud)
查询完美无缺.但是,如果我这样做的查询:
GeoliteBlock.where("startIpNum >= ?", 2776360991)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
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)
Run Code Online (Sandbox Code Playgroud)
但我知道该列存在,因为我只是用第一个代码示例查询它.关于为什么会发生这种情况的任何想法,以及我如何消除它?谢谢你的帮助!
SQL中的列名称不区分大小写,除非它们在创建时被引用.有人在你的startIpNum列周围创建了引号,因此每次使用它时都必须引用它:
GeoliteBlock.where('"startIpNum" >= ?', 2776360991)
Run Code Online (Sandbox Code Playgroud)
你从PostgreSQL中得到的错误提到,startipnum因为PostgreSQL将标识符规范化为小写(SQL标准说它们应该归一化为大写).
这个:
GeoliteBlock.find_by_startIpNum 2776360991
Run Code Online (Sandbox Code Playgroud)
因为AR会引用startIpNuM你背后的部分而起作用.同样,GeoliteBlock.where(:startIpNum => 2776360991)也会奏效.
我建议您更改架构以使用小写列名称,这样您就不必再担心这一点.
| 归档时间: |
|
| 查看次数: |
1332 次 |
| 最近记录: |