ActiveRecord Where子句-单引号错误



在ActiveRecord(使用Ruby on Rails),如果我有@products变量,其中@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注入,我有目的地尝试像这样执行查询。

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

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

对于您的其他问题:

当你用字符串值过滤一个整数列时,db引擎会隐式地将列值转换为字符串来执行搜索。

更新

通用SQL标准由这个问题的答案描述。总之,大多数Db引擎遵循大多数ANSI标准,双引号的使用通常是为数据库对象保留的。

最新更新