【问题标题】:syntax error when attempting to use bind vars in SQL queries in Ruby尝试在 Ruby 中的 SQL 查询中使用绑定变量时出现语法错误
【发布时间】:2012-08-21 14:31:12
【问题描述】:

我正在使用 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

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

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

【问题讨论】:

  • 你是否在命令行中传递了三个参数?
  • 我想它实际上是一个命名错误的变量。这是一个拆分字符串。第二个问题实际上是第一个问题的一部分。不过还是谢谢。

标签: sql ruby sqlite bind sqlite3-ruby


【解决方案1】:

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

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. 您的论点确实在 cmd_args[1..2] 而不是 cmd_args[0..1]

【讨论】:

  • 那种简单的感觉让您感到宽慰和沮丧。感谢您进一步了解该空间为何会引起麻烦。我将不得不继续寻找第二个问题,但谢谢。
  • @bismuth:空格问题与在 Ruby 中能够调用不带括号的方法有关。
猜你喜欢
  • 2018-07-12
  • 2022-01-16
  • 2021-04-17
  • 2017-08-14
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多