Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 尝试插入SQLite数据库时是否可能返回布尔值?_Ruby_Database_Sqlite_Sql Insert_Sequel - Fatal编程技术网

Ruby 尝试插入SQLite数据库时是否可能返回布尔值?

Ruby 尝试插入SQLite数据库时是否可能返回布尔值?,ruby,database,sqlite,sql-insert,sequel,Ruby,Database,Sqlite,Sql Insert,Sequel,我从命令行创建了一个SQLite数据库,其中包含以下列:标题、日期、url和位置。然后,我在标题、日期、url和位置上添加了一个唯一的约束,目的是防止插入相同的行 我插入了第一批数据,它工作得很好。为了测试唯一约束,我尝试重新插入所有数据,并获得: ...SQLite3::ConstraintException: UNIQUE constraint failed: events.title... 错误如预期 但是,我不希望程序在插入失败时停止运行,而是希望它返回Bool,以便在插入成功时可以增

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

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

...SQLite3::ConstraintException: UNIQUE constraint failed: events.title...
错误如预期

但是,我不希望程序在插入失败时停止运行,而是希望它返回Bool,以便在插入成功时可以增加一个名为newevents的变量

我是否需要更改数据库的设置方式,或者是否有办法做到这一点

顺便说一下,我正在使用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

任何和所有的指导都是非常感谢的,如果这个问题看起来完全迟钝,请原谅我的无知。对我来说,使用数据库是一件很新鲜的事情

返回
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

拯救一个非常特定的、预期的异常的模式通常是必要的。

返回
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

拯救一个非常特定的、预期的异常的模式通常是必要的。

Ruby没有捕获异常的方法吗?我能想到的让数据库返回false而不是抛出异常的唯一方法是将其捕获在执行插入的存储过程中,但据我所知,sqlite不执行存储过程。显然ruby确实有处理异常的方法@tadman在下面解释说,Ruby没有捕获异常的方法吗?我能想到的让数据库返回false而不是抛出异常的唯一方法是将其捕获在执行插入的存储过程中,但据我所知,sqlite不执行存储过程。显然ruby确实有处理异常的方法@塔德曼在下面解释。啊,我明白了!这很有道理!非常感谢@tadman!啊,我明白了!这很有道理!非常感谢@tadman!