1

我正在使用 sqlite3 并尝试将绑定变量传递到命令行应用程序中的 SQL 语句中,我正在尝试将其作为http://www.pangloss.com/seidel/shake_rule.html的复制。这是用于添加/删除数据库的管理实用程序。我只是想了解如何将 SQL 与 Ruby 一起使用,并为我目前正在玩的游戏的 DM 构建一个纸笔 rpg 实用程序集。

db.execute ("INSERT INTO insults (position, string) VALUES (?, ?);",    cmd_args[1].to_i, cmd_args[2])

db.execute("SELECT * FROM insults WHERE position = ? AND string = ?;", cmd_args[1].to_i, cmd_args[2]) do |output|
  puts output
end

第一个查询导致语法错误“意外',',期待')'”和更多错误,但是当我注释掉这一行时它们消失了。

后一个查询似乎没有根本的不同,但是当我注释掉前者时它不会导致错误。当我手动设置 cmd_args 数组值时,它仍然没有输出任何内容。数据库中有一些测试元素,即“1|test”不输出,但没有抛出错误。

4

1 回答 1

4

方法名称和左括号之间不能有空格。你的第一个:

db.execute ("INSERT INTO insults (position, string) VALUES (?, ?);",    cmd_args[1].to_i, cmd_args[2])

更像是这样解释的:

x = ("INSERT ....", cms_args[1].to_i, cmd_args[2])
db.execute x

但是(a, b, c)在这种情况下,像这样的结构不是合法的 Ruby 语法,并且存在语法错误。

你的第二个:

db.execute("SELECT * ...", cmd_args[1].to_i, cmd_args[2]) do |output|
  puts output
end

应该可以正常工作,因此您的 WHERE 子句可能与任何内容都不匹配,因此您不会得到任何结果。检查内容cmd_args并确保:

  1. 你没有任何杂散的空白。
  2. 您的论点确实是 incmd_args[1..2]而不是cmd_args[0..1].
于 2012-08-27T05:12:45.437 回答