好的,我已经坚持了好几次了。我想使用mysql gem用xml文件中的数据填充数据库,但是当我尝试执行准备好的语句时遇到问题。
@dbi = Mysql.new(@host,@userid,@pwrd,@database)
query = "INSERT IGNORE INTO sha1( sha1_date, sha1) VALUES (? , ?) "
@prep = @dbi.prepare(query)
res = @prep.execute( ir.date, ir.sha1)
#this first query works, i can find the inserted row in the DB
@prep = @dbi.prepare("SELECT id FROM sha1 WHERE sha1 = ?")
res = @prep.execute(ir.sha1)
puts res.fetch
#but here the prepared statement return an empty string.
我希望能够进行这样的SELECT,因为最终查询看起来像这样
query = "INSERT INTO integration_job(sha1_id, branch_id, integration_stage_id, status_id, name) VALUES (
(SELECT id FROM sha1 WHERE sha1 = ?),
(SELECT id FROM branch WHERE name = ?),
(SELECT id FROM integration_stage WHERE name = ?),
(SELECT id FROM integration_status WHERE name = ?),
?)"
@prep = @dbi.prepare(query)
res = @prep.execute(ir.sha1, ir.branch, ir.stage, ir.status, ir.job
我尝试对其他表执行相同类型的查询,并且它起作用了。我的猜测是我传递给execute()方法的参数太长了。
puts ir.sha1 # => dba759e168e734fcc2eaf114269879177ef6a0b1
但是我找不到有关参数限制大小的信息,所以我真的不知道该怎么办。
所以我有几个问题:
[编辑] 好的,我找到了解决方案,只是我将存储sha1的VARCHAR字段的大小限制为40个字符。 (它使我感觉sha1 IS长40个字符)但是sha1的解析为字符串增加了一个尾行字符,使其长度为41个字符。我用gsub(“ \ n”)删除了它,现在一切正常。
感谢您的评论,他们对此有所不同。