ruby - sqlite3不关闭db可以吗

标签 ruby

这是我的方法

def convertElsToMass(symbol)
    begin
       db = SQLite3::Database.open("test.db")

       rs = db.prepare("SELECT * FROM Elements WHERE symbol = '#{symbol}    '")
       temp = rs.execute
       mass = temp.first

       rescue SQLite3::Exeption => e
            puts e

       ensure
            db.close if db
    end       
    return mass[3]   
end

当我使用 rspec 测试此方法时,我收到此错误消息:

 1) PeriodicTable should change Elements to mass of Elements
 Failure/Error: expect(table.convertElsToMass("Na")).to eq(22.9898)
 SQLite3::BusyException:
   unable to close due to unfinalized statements or unfinished backups
 # ./lib/formatel.rb:42:in `close'
 # ./lib/formatel.rb:42:in `convertElsToMass'
 # ./spec/lib/pt_spec.rb:13:in `block (2 levels) in <top (required)>'

我注意到,如果我不添加行 db.close if db 这个方法的效果完全符合我的预期。但是我担心如果执行查询后不关闭数据库会产生什么后果。如何解决此问题,以便在执行查询后关闭数据库?

最佳答案

您无需担心关闭数据库。当您调用 prepareexecute 时,这些调用在完成后会自动调用 close。有一个内部 rescue/ensure block ,可以确保数据库关闭,即使出现错误也是如此。您可以在 SQLite3::Database 的源代码中看到这一点.

关于ruby - sqlite3不关闭db可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25987852/

相关文章:

ruby - 文件对象是否应该发送给sidekiq worker

ruby - 在 Ruby 中,如果我们定义了一个方法调用 "c=",为什么 c = 3 不能调用它?

javascript - 如何使用 Hubot 运行异步 Ruby 脚本?

ruby - gearman 任务队列因已完成的任务而溢出

ruby-on-rails - 无法打开 Rails 服务器

ruby-on-rails - 将 curl 转换为等效的 ruby

ruby-on-rails - Ruby - 测试是否可以连接数据库

ruby-on-rails - 如何在 Rails 迁移中将数据从一个表移动到另一个表?

ruby-on-rails - 将 header 附加到 Rspec Controller 测试

ruby - rvm Ruby 安装期间运行 '__rvm_make -j 1' 错误 |打开SSL错误