sqlite3.OperationalError: база данных заблокирована - непотоковое приложение - PullRequest
4 голосов
/ 03 апреля 2010

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

Следующая функция является одной из многих, которая обращается к базе данных 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()

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

Ответы [ 2 ]

2 голосов
/ 07 апреля 2010

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

1 голос
/ 04 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...