【问题标题】:Inserting/Updating numeric string in Sqlite with Ruby (Newbie query)使用 Ruby 在 Sqlite 中插入/更新数字字符串(新手查询)
【发布时间】:2013-07-29 23:02:49
【问题描述】:

我有一个简单的 Sqlite 表,其中包含电话号码和计数器的 2 列。我想根据还包含电话号码和计数器的 .csv 文件更新表格。如果数据库中存在该数字,则应通过现有计数器的总和 + 文件中的计数器进行更新。如果它不存在,则应使用文件中的值插入一条新记录。 我剩下的一个问题是电话号码的第一个位置为零。 当我填充数据库时,零被保留,(我可以手动选择并找到一个现有的数字,如 09999)当我从文件中获取值时,零被保留,但是当我尝试插入/更新时,我的 Ruby 代码中发生了一些事情插入不带前导零的新记录,因此 0999 在数据库中变为 999。没有前导零的数字被正确处理。 我的代码如下所示:

rowArray=thisFile[k].split(';')
number = rowArray[0]
couplings = rowArray[1]


updString="INSERT OR REPLACE INTO Caller (Telno,count) VALUES (#{number},COALESCE((SELECT count + #{couplings} FROM Caller WHERE Telno=#{number}),#    {couplings}))"

db.execute(updString)

知道我在这里做错了什么吗?最简单的解决方案是去掉前导零,但我更愿意做对。非常感谢。

【问题讨论】:

    标签: ruby sqlite insert


    【解决方案1】:

    您需要在prepare 调用中使用占位符,并将调用中的实际值传递给execute。像这样

    insert = db.prepare(<<__SQL__)
    INSERT OR REPLACE INTO Caller (Telno, count)
    VALUES (:number, COALESCE((SELECT count + :couplings FROM Caller WHERE Telno = :number), :couplings))
    __SQL__
    
    insert.execute(number: number, couplings: couplings)
    

    (请注意,SQL 语句中的:number:couplings命名占位符。它们可以是任何东西,但我选择它们以匹配要成为的变量的相应名称绑定。)

    问题是,使用简单的插值,你最终会得到一个字符串

    INSERT OR REPLACE INTO Caller (Telno, count) VALUES (0999, ...
    

    并且0999 似乎是一个数字而不是一个字符串。如果您将字符串传递给execute,那么变量将被绑定到正确的类型。

    【讨论】:

    • 感谢 Borodin,修复了它,现在我了解了机制。
    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多