Есть следующий кусок кода
#!/usr/bin/env ruby
# encoding: UTF-8
#
# Here should go some comment
#
require 'rubygems'
require 'sqlite3'
database = SQLite3::Database.new('/dev/shm/test-20120625-124831.sqlite')
database.transaction()
a = ['some', 'some', 'extra']
query = 'insert into architectures (architecture) values (?)'
a.each { |arch|
begin
statement = database.prepare(query)
statement.bind_params(arch)
statement.execute()
rescue SQLite3::Exception => exception
puts "Database error happened"
puts "Message: #{exception.message()}"
puts "Sql query: #{query}"
puts "Value: #{arch}"
end
#p statement.methods.sort
#statement.close
}
database.commit()
database.close()
при его запуске получаю следующий выхлоп
vv@vv-Latitude-E5520 /tmp $ ruby statement_test.rb
Database error happened
Message: column architecture is not unique
Sql query: insert into architectures (architecture) values (?)
Value: some
statement_test.rb:34:in `close': unable to close due to unfinalised statements (SQLite3::BusyException)
from statement_test.rb:34
vv@vv-Latitude-E5520 /tmp $
что нужно сделать со statement для второго item чтобы безопасно закрыть базу? close не работает. если убрать дубль «some» — то все работает.
не предлагать
- удалять дубли перед инсертом
- заменить insert на insert or ignore или сделать поле не уник