У меня есть приложение 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()
Большое спасибо.
База данных должна быть полностью закрыта до вызова этой функции. Если бы я должен был открыть соединение с базой данных, какой был бы лучший метод? Храните экземпляр 'connection' вне области действия функции или передайте его как параметр? –
Было бы более аккуратным, если бы вы сделали класс, поместили все функции, связанные с базой данных в классе, со связью в качестве атрибута элемента этого класса. Вы можете создать соединение в классе '__init__' и добавить метод close_connection (с очевидным контентом), который вы вызываете, когда закончите. В противном случае вы можете искать свой код и добавлять операторы отладки всякий раз, когда вы открываете и закрываете соединение с базой данных, смотрите, являются ли они вложенными. – tzot