2013-07-29 29 views
0

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

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) 

任何想法,我做错了什么?最简单的解决方案是放弃前导零,但我宁愿做正确的。提前谢谢了。

回答

0

您需要在prepare调用中使用10占位符,并将调用中的实际值传递给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似乎是一个数字,而TH一个字符串。如果您将字符串传递给execute,那么变量将以正确的类型绑定。

+0

感谢鲍罗丁,修复它,现在我明白了机制。 – user2630253