【问题标题】:Sqlite3 `step': constraint failed (SQLite3::ConstraintException)Sqlite3 `step': 约束失败 (SQLite3::ConstraintException)
【发布时间】:2012-04-20 14:36:33
【问题描述】:

我正在尝试转换一些 JSON 数据并使用 Ruby 将其插入到 sqlite3 数据库中。 JSON 来自 githubarchive.com 我遵循了关于这个问题的建议:Escaping Strings For Ruby SQLite Insert,我的代码如下所示:

Yajl::Parser.parse(open(input).read) do |event|
r = CSV::Row.new(headers, [])
flatmap({}, event).each do |k,v|
  v = (Time.parse(v).utc.strftime('%Y-%m-%d %T') rescue '') if k =~ /_at$/
  if r.include? k
    r[k] = v
  else

   puts "Unknown field: #{k}, value: #{v}"
        end
    end 
#   tmp << r.to_s
db = SQLite3::Database.open( "../github.sqlite" )
val = (['?'] * 186).join(',')
ins = db.prepare("insert into Sheet1_copy values (#{val})")
ins.execute(r.to_s)

上面的部分取自他们的 git 项目。现在,当我尝试使用任何数据运行它时,我得到了

gems/sqlite3-1.3.5/lib/sqlite3/statement.rb:67:in `step': constraint failed (SQLite3::ConstraintException)

有什么想法吗? 谢谢!

【问题讨论】:

  • 你为什么要使用 CSV::Row?为什么不直接使用数组?
  • 使用这里的代码并尝试重新利用它:github.com/igrigorik/githubarchive.org/blob/master/bigquery/… 所以我需要它从 JSON 到 SQlite
  • 然后从 JSON 直接转到 SQLite,把 CSV 的东西放在外面,这只会造成麻烦。
  • @muistooshort 我试过了,需要一点指导:js = File.open(input, "r") Yajl::Parser.parse(js) do |event| # print event db = SQLite3::Database.open( "../github.sqlite" ) val = (['?'] * 186).join(',') ins = db.prepare("insert into Sheet1_copy values (#{val})") ins.execute(event) end
  • 我猜您必须先将 Ruby 布尔值转换为 1 和 0,然后再尝试将它们插入数据库。

标签: ruby sqlite


【解决方案1】:

您还需要做一些准备才能正确加载它。这是一个工作副本:https://gist.github.com/2426614

请注意,我没有使用准备好的语句,因为这将需要更多的体操来填充所有不同类型事件的空行。话虽如此,它的运行速度非常快。

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2019-12-25
    • 2013-03-04
    相关资源
    最近更新 更多