LINUX.ORG.RU

Как бороться с «unable to close due to unfinalised statements»

 , , ,


0

0

Есть следующий кусок кода

#!/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 или сделать поле не уник
★★★★★

Ответ на: комментарий от anonymous

почему то я сомневаюсь что проект с 2,755 загрузок будет лучше чем с 2,045,874

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от anonymous

транзакция здесь не причем. если закомментировать transaction/commit ошибка буде та же

кстати ваш rdbi не подключается

vv@vv-Latitude-E5520 /tmp $ ruby statement_test_rdbi.rb 
/usr/lib/ruby/gems/1.8/gems/rdbi-0.9.1/lib/rdbi/pool.rb:17: uninitialized constant RDBI::Pool::Mutex (NameError)
	from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
	from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
	from /usr/lib/ruby/gems/1.8/gems/rdbi-0.9.1/lib/rdbi.rb:172
	from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:59:in `gem_original_require'
	from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:59:in `require'
	from statement_test_rdbi.rb:10
vv@vv-Latitude-E5520 /tmp $ 

не подскажете в чем трабла?

ZuBB ★★★★★
() автор топика
Ответ на: комментарий от ZuBB

в твоём изначальном коде проблема в

database.transaction()

ты открываешь транзакцию и не завершаешь её. Кажется так. А здесь хз что, у меня с 1.9 всё работает, 1.8 давно не юзаю.

anonymous
()
Ответ на: комментарий от anonymous

завершаю. иначе я бы не увидел в таблице architectures 2 новых значения

vv@vv-Latitude-E5520 /tmp $ sqlite3 /dev/shm/test-20120625-124831.sqlite 'select count(*) from architectures;'
18
vv@vv-Latitude-E5520 /tmp $ ruby statement_test.rb 
"=========="
"some"
"=========="
"some"
Database error happened
Message: column architecture is not unique
Sql query: insert into architectures (architecture) values (?)
Value: some
"=========="
"extra"
statement_test.rb:36:in `close': unable to close due to unfinalised statements (SQLite3::BusyException)
	from statement_test.rb:36
vv@vv-Latitude-E5520 /tmp $ 
vv@vv-Latitude-E5520 /tmp $ sqlite3 /dev/shm/test-20120625-124831.sqlite 'select count(*) from architectures;'
20
vv@vv-Latitude-E5520 /tmp $ 
ZuBB ★★★★★
() автор топика
Ответ на: комментарий от anonymous

кстати код с rdbi тоже добавляет две записи. но ошибка там другая..

vv@vv-Latitude-E5520 /tmp $ sqlite3 /dev/shm/test-20120625-124831.sqlite 'select count(*) from architectures;'
18
vv@vv-Latitude-E5520 /tmp $ ruby statement_test_rdbi.rb 
"=========="
"some"
"=========="
"some"
Database error happened
Message: column architecture is not unique
Sql query: insert into architectures (architecture) values (?)
Value: some
"=========="
"extra"
/usr/lib/ruby/gems/1.8/gems/rdbi-driver-sqlite3-0.9.1/lib/rdbi/driver/sqlite3.rb:244:in `close': column architecture is not unique (SQLite3::ConstraintException)
	from /usr/lib/ruby/gems/1.8/gems/rdbi-driver-sqlite3-0.9.1/lib/rdbi/driver/sqlite3.rb:244:in `initialize'
	from /usr/lib/ruby/gems/1.8/gems/rdbi-0.9.1/lib/rdbi/statement.rb:182:in `call'
	from /usr/lib/ruby/gems/1.8/gems/rdbi-0.9.1/lib/rdbi/statement.rb:182:in `finish'
	from /usr/lib/ruby/gems/1.8/gems/rdbi-0.9.1/lib/rdbi/database.rb:95:in `disconnect'
	from /usr/lib/ruby/gems/1.8/gems/rdbi-0.9.1/lib/rdbi/database.rb:95:in `each'
	from /usr/lib/ruby/gems/1.8/gems/rdbi-0.9.1/lib/rdbi/database.rb:95:in `disconnect'
	from /usr/lib/ruby/gems/1.8/gems/rdbi-driver-sqlite3-0.9.1/lib/rdbi/driver/sqlite3.rb:34:in `disconnect'
	from statement_test_rdbi.rb:38
/usr/lib/ruby/gems/1.8/gems/rdbi-driver-sqlite3-0.9.1/lib/rdbi/driver/sqlite3.rb:244: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [i686-linux]

Aborted (core dumped)
vv@vv-Latitude-E5520 /tmp $ sqlite3 /dev/shm/test-20120625-124831.sqlite 'select count(*) from architectures;'
20
vv@vv-Latitude-E5520 /tmp $ 

ZuBB ★★★★★
() автор топика

Как бороться с «unable to close due to unfinalised statements»

никак. иго (statement) нужно закрывать

ZuBB ★★★★★
() автор топика
12 декабря 2012 г.
Ответ на: комментарий от ZuBB

делать finalize() перед вызовом close() и будет вам счастье.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.