这是我的方法
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
这个方法的效果完全符合我的预期。但是我担心如果执行查询后不关闭数据库会产生什么后果。如何解决此问题,以便在执行查询后关闭数据库?
最佳答案
您无需担心关闭数据库。当您调用 prepare
或 execute
时,这些调用在完成后会自动调用 close。有一个内部 rescue/ensure
block ,可以确保数据库关闭,即使出现错误也是如此。您可以在 SQLite3::Database 的源代码中看到这一点.
关于ruby - sqlite3不关闭db可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25987852/