尝试插入SQLite数据库时可能返回Bool值?

时间:2016-07-01 20:27:10

标签: ruby database sqlite sql-insert sequel

我从命令行创建了一个SQLite数据库,其中包含列:title,date,url和location。然后我在标题,日期,网址和位置上添加了一个唯一约束,其目的是防止插入相同的行。

我插入了第一批数据,效果很好。为了测试唯一约束,我尝试重新插入所有数据并获得:

...SQLite3::ConstraintException: UNIQUE constraint failed: events.title...

错误如预期。

但是,如果插入失败,我不希望程序停止运行,而是希望它返回Bool,这样当插入成功时我可以增加一个名为new events的变量。

我是否需要更改设置数据库的方式,还是有办法实现此目的?

顺便说一下,我正在使用Ruby和Sequel。

这是插入的源代码

    newEventCount = 0
    events.each do |event|
        result = eventDB.insert(:title => event.get_title, :date => event.get_date, :url => event.get_url, :location => event.get_location)
        if result == false
            puts "Already have it"
        else
            newEventCount = newEventCount + 1
        end
    end

任何和所有指导都深表感谢,请原谅我的无知,如果这个问题看起来完全是钝的话。使用数据库对我来说是一个新手。

1 个答案:

答案 0 :(得分:2)

返回false意味着可以忽略错误,而且这意味着传播这些错误可能需要大量工作。异常会自动冒出来,如果它们到达顶部,则会发生以下情况:您的程序崩溃。

缓解此问题的方法是处理异常:

events.each do |event|
  begin
    eventDB.insert(
      title: event.get_title,
      date: event.get_date,
      url: event.get_url,
      location: event.get_location
     )

     newEventCount += 1
  rescue SQLite3::ConstraintException
    # Already inserted, can be ignored.
  end
end

这种拯救非常具体的预期例外的模式通常是必要的。