Python/SQLite3: не удается выполнить фиксацию — ни одна транзакция не активна

Я пытаюсь закодировать индексатор книг, используя Python (традиционный, 2.7) и SQLite (3).

Код сводится к следующей последовательности операторов SQL:

'select count(*) from tag_dict' ()
/* [(30,)] */
'select count(*) from file_meta' ()
/* [(63613,)] */
'begin transaction' ()
'select id from archive where name=?' ('158326-158457.zip',)
/* [(20,)] */
'select id from file where name=? and archive=?' ('158328.fb2', 20)
/* [(122707,)] */
'delete from file_meta where file=?' (122707,)
'commit transaction' ()
# error: cannot commit - no transaction is active

Уровень изоляции — «ОТЛОЖЕННЫЙ» («ИСКЛЮЧИТЕЛЬНЫЙ» не лучше).

Я попытался использовать connection.commit() вместо cursor.execute('commit') - ничего полезного не произошло.

  • Конечно, я искал в stackoverflow и в Сети, но найденные ответы не имеют значения.
  • Режим автоматической фиксацииявляется неприемлемымпо соображениям производительности.
  • Я одновременно использую только один файл базы данных.
  • Мой код выполняется в одном потоке.
  • Все выполнение SQL выполняется с помощью одной функции, которая гарантирует, что у меня одновременно открыто не более только одногокурсора.

Итак, что не так с транзакцией?

Если я использую connection.commit() (обратите внимание: метода connection.begin нет!), то я просто теряю свои данные.

Конечно, я дважды/тройно/д проверил права доступа к файлу базы данных и его каталогу.


Что ж, как это часто бывает, я нашел решение буквально через несколько минут после того, как задал вопрос.

Как новичок, я не могу ответить на свой вопрос уже 8 часов... Итак, ответ теперь есть:

Решение было найдено здесьи состоит из единственной идеи:

Никогда не используйте BEGIN/COMMIT в режиме без автоматической фиксации в приложении Python — используйте db.commit( ) и только db.rollback()!

Звучит странно, но это работает.

16
задан Craig S. Anderson 21 June 2019 в 05:19
поделиться