【问题标题】:Trouble inserting row into sqlite3 database with ruby library使用 ruby​​ 库将行插入 sqlite3 数据库时遇到问题
【发布时间】:2011-05-27 01:21:54
【问题描述】:

我是个新手。我有一个数据库,其中有一个名为 OUTPUTS 的表,其中所有列都是整数类型。我正在尝试使用以下 ruby​​ 脚本在 OUTPUTS 中插入一行:

require 'rubygems'
require 'sqlite3'
...
db=SQLite3::Database.new("development.sqlite3")
db.execute( "INSERT into OUTPUTS (user_id,eac,pac,vac,iac,epv,ppv,vpv) VALUES (10,@eac,@pac,@vac,@iac,@epv,@ppv,@vpv);" )

运行此脚本后,我确实得到了一个新行,并且 user_id 列中按预期包含了 10,但是即使我验证了所有变量(@eac、@pac、等)确实包含值。我的语法有什么问题?

【问题讨论】:

  • 想通了。仍然不完全确定为什么上述方法不起作用,但确实如此:
  • st=db.prepare("INSERT into OUTPUTS (user_id,eac,pac,vac,iac,epv,ppv,vpv) VALUES (?,?,?,?,?,?,? ,?)")\nst.execute(10,@eac,@pac,@vac,@iac,@epv,@ppv,@vpv)
  • 见下文,但基本上你不能将变量放入字符串中并在不将它们包装在 #{} 中的情况下让它们呈现——但无论如何你的解决方案更好,因为绑定几乎总是去吧。

标签: ruby sqlite


【解决方案1】:

您将变量的名称发送到 sqlite,而不是它们的值。这就是你想要的:

db.execute( "INSERT into OUTPUTS (user_id,eac,pac,vac,iac,epv,ppv,vpv)
VALUES (10,#{@eac},#{@pac},#{@vac},#{@iac},#{@epv},#{@ppv},#{@vpv});" )

但更好的是像这样使用变量绑定:

db.execute( "INSERT into OUTPUTS (user_id,eac,pac,vac,iac,epv,ppv,vpv) 
VALUES (10,?,?,?,?,?,?,?)",
@eac,@pac,@vac,@iac,@epv,@ppv,@vpv)

(我可能把我的计数搞砸了)。

查看How do I use placeholders in an SQL statement?了解更多详情。

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 2017-11-19
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多