我从命令行创建了一个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
任何和所有指导都深表感谢,请原谅我的无知,如果这个问题看起来完全是钝的话。使用数据库对我来说是一个新手。
答案 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
这种拯救非常具体的预期例外的模式通常是必要的。