2010-04-02 2 views
4

У меня есть приложение Python, которое выдает стандартную ошибку sqlite3.OperationalError: database is locked. Я просмотрел интернет и не смог найти какое-либо решение, которое сработало (обратите внимание, что многопроцессов/потоков не происходит, и, как вы видите, я попытался повысить параметр таймаута). Файл sqlite хранится на локальном жестком диске.sqlite3.OperationalError: база данных заблокирована - непоточенное приложение

Следующая функция является одной из многих, которая обращается к базе данных sqlite и отлично работает в первый раз, когда она вызывается, но выдает указанную выше ошибку во второй раз, когда она вызывается (она называется частью цикла for в другом функция):

def update_index(filepath): 
    path = get_setting('Local', 'web') 
    stat = os.stat(filepath) 
    modified = stat.st_mtime 
    index_file = get_setting('Local', 'index') 

    connection = sqlite3.connect(index_file, 30) 
    cursor = connection.cursor() 
    head, tail = os.path.split(filepath) 
    cursor.execute('UPDATE hwlive SET date=? WHERE path=? AND name=?;', (modified, head, tail)) 
    connection.commit() 
    connection.close() 

Большое спасибо.

ответ

1

Вам действительно нужно постоянно открывать и закрывать файл базы данных для каждого обновления UPDATE? Если вы делаете то же самое в каждой функции, которая обращается к базе данных, возможно ли, что вы вызвали функцию update_index из другой функции, которая уже открыла базу данных , используя другое соединение и находится в процессе изменения базы данных?

+0

База данных должна быть полностью закрыта до вызова этой функции. Если бы я должен был открыть соединение с базой данных, какой был бы лучший метод? Храните экземпляр 'connection' вне области действия функции или передайте его как параметр? –

+3

Было бы более аккуратным, если бы вы сделали класс, поместили все функции, связанные с базой данных в классе, со связью в качестве атрибута элемента этого класса. Вы можете создать соединение в классе '__init__' и добавить метод close_connection (с очевидным контентом), который вы вызываете, когда закончите. В противном случае вы можете искать свой код и добавлять операторы отладки всякий раз, когда вы открываете и закрываете соединение с базой данных, смотрите, являются ли они вложенными. – tzot

2

В частности, вы можете проверить функции, которые содержат блокировку чтения (незавершенный курсор). Это блокирует фиксацию из функции обновления. Обратите внимание, что для проблем Python-sqlite имеется выделенный список рассылки: http://groups.google.com/group/python-sqlite