1

我想INSERT在具有以下数组的 Ruby 文件中执行我的字符串:

names_arr = ["Jack", "Susan", "Peter"]

在同一个 Ruby 文件中,我需要 SQLite3 gem 并拥有以下代码:

names_arr.each do |each_name|
  db.execute('INSERT INTO users (name) VALUES ("#{each_name}");')
end

我在我的“用户”表中期待这个:

id  name
1   Jack
2   Susan
3   Peter

相反,我得到了这个:

id  name
1   #{each_name}
2   #{each_name}
3   #{each_name}

很明显我没有正确插值,但我尝试了很多不同的东西,但不知道我错在哪里。

我正在使用 SQLite3 和 Ruby。

4

1 回答 1

2

这段代码有几个问题:

names_arr.each do |each_name|
  db.execute('INSERT INTO users (name) VALUES ("#{each_name}");')
end
  1. 您正在尝试在单引号字符串中使用 Ruby 的字符串插值,但字符串插值仅适用于双引号字符串(以及 heredocs、%Q{...}字符串、正则表达式文字......)。
  2. 标准 SQL 对字符串文字使用单引号,而不是双引号。一些数据库可以让你摆脱双引号,但这是一个非常糟糕的习惯。
  3. 无论如何,您不应该使用字符串插值来构建 SQL,因为您没有在 1999 年破解 PHP,因此您应该使用占位符并让数据库库处理引用。

SQLite 驱动程序execute理解?占位符,因此您可以这样说:

names_arr.each do |each_name|
  db.execute('INSERT INTO users (name) VALUES (?)', each_name)
end
于 2013-10-06T22:14:09.337 回答