【问题标题】:ActiveRecord Where Clause - Single Quotes error?ActiveRecord Where 子句 - 单引号错误?
【发布时间】:2015-08-21 03:41:32
【问题描述】:

在 ActiveRecord(使用 Ruby on Rails)中,如果我有 @products 变量 where @products = Product.all,我会说:

@products.where("name = 'check123' "),它返回一个匹配该条件的对象数组,但是如果我去@products.where('name="check123"') 我得到一个错误?

: SELECT "products".* FROM "products" WHERE (name = "check123")
Hirb Error: PG::UndefinedColumn: ERROR:  column "check123" does not exist
LINE 1: SELECT "products".* FROM "products" WHERE (name = "check123"...
                                                      ^

为什么会这样?似乎我必须始终在 where 子句中的所有内容周围使用双引号,对其中的任何字符串使用单引号?

单引号不应该在这里也起作用,还是我没有得到什么

其他一些观察:

@products.where("cost = '23.0'") 有效,尽管事件 23 的数据类型是整数而不是字符串? @products.where('cost = 23') 有效,所以我知道我可以在 where 子句中使用单引号

注意:我知道使用“?” where 子句中的语法以避免 sql 注入,我故意尝试像这样执行查询。

【问题讨论】:

  • 我很好奇你为什么要故意将一个加载的 RPG 指向自己的脚。

标签: sql ruby-on-rails ruby ruby-on-rails-4 rails-activerecord


【解决方案1】:

双引号用于命名数据​​库对象(表名、列名、用户名、模式名...),而单引号用于表示用作值的字符串。

所以你的UndefinedColumn: ERROR 是有意义的,因为当使用@products.where('name="check123"') 过滤时,生成的SQL 将是.... where name = "check123"。 db 引擎正在尝试查找名称为 check123 的列,并将其值与列 name 的值匹配。由于您的表中不存在列 check123,因此您会收到“未定义的列名”错误。

关于您的其他问题:

当您通过字符串值过滤整数列时,数据库引擎会将列值隐式转换为字符串以执行搜索。

更新

通用 SQL 标准由this question's answers 描述。总之,大多数 Db 引擎都遵循大部分 ANSI 标准,而双引号的使用通常是为数据库对象保留的。

【讨论】:

  • '双引号 - db 对象,单引号 - 字符串' -> 这是专门针对 WHERE 子句内部的原因吗?您也可以为此提供参考
  • 我已经用你的参考更新了答案,如果这对你来说足够信息,请告诉我们
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2011-08-14
  • 2016-01-09
  • 2016-12-06
相关资源
最近更新 更多