为什么变量在 `execute` SQL 查询中需要单引号?

Why do variables need single quotes in `execute` SQL query?

鉴于 name = "Ben",这不起作用:

DB.execute("SELECT id FROM departments WHERE name = #{name}")

但这确实如此(添加了单引号):

DB.execute("SELECT id FROM departments WHERE name = '#{name}'")

为什么?为什么 Ruby 不调用第一个例子中的变量?它已经是一个字符串。我不明白为什么这会有什么不同。那不就相当于通过了"'Ben'"吗?这不等同于传递 "Ben" 吗?

这不是 Ruby 问题,而是 SQL 语法问题。

WHERE name = tom 

WHERE name = 'tom'

是两个不同的东西。

在第一种情况下,它被视为模式对象名称(这里大概是列名),在第二种情况下,它是一个字符串文字。

每当您使用一种编程语言通过直接字符串操作为另一种编程语言(此处 Ruby -> SQL)创建程序时,您 运行 就会遇到同样的问题。

正确的方法是使用绑定变量。

WHERE name = ?

这也解决了 name 包含特殊字符的问题。

name = "Little Bobby Tables, see http://xkcd.com/327/"