Как предотвратить отмену изменений «Операционная ошибка: база данных заблокирована»?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как предотвратить отмену изменений «Операционная ошибка: база данных заблокирована»?

Сообщение Anonymous »

У меня есть приложение, которое периодически записывает данные в базу данных с помощью SQLite3 Python. К сожалению, когда я открываю базу данных с помощью DBBrowser, он иногда может заблокировать базу данных. В этом случае курсор.commit() отменит изменения при возникновении OperationalError: база данных заблокирована. Есть ли способ «сохранить» эти изменения до тех пор, пока база данных снова не станет свободной? Например, постоянное переключение их в следующий курсор.commit()?
Чтобы внести ясность, я не спрашиваю, почему база данных заблокирована или как это предотвратить - это из-за DBBrowser. Я спрашиваю, есть ли способ предотвратить отмену изменений. Будь то напрямую через sqlite или каким-то другим способом ручного сохранения и повторной попытки каждой команды.
РЕДАКТИРОВАТЬ: для каждого запроса в комментариях, вот простой пример, который я проверил, чтобы убедиться. это было отбрасывание, как я и думал. Он просто увеличивает счетчик и перемещает его каждые 10 секунд. Через несколько секунд я открыл DBBrowser, чтобы он заблокировался, а затем закрыл его.

Код: Выделить всё

con = sqlite3.connect("test.db")
cur = con.cursor()
i = 0

while (True):
try:
cur.execute("INSERT INTO TestTable VALUES(?)", (i,))
con.commit()
print(f"committed i={i}")
except sqlite3.OperationalError as e:
traceback.print_exception(e)
i += 1
print(f"i={i}")
time.sleep(10)
А вот вывод журнала

Код: Выделить всё

committed i=0
i=1
committed i=1
i=2
committed i=2
i=3
committed i=3
i=4
Traceback (most recent call last):
File "l:\Coding\Python\sqlite3test\main.py", line 11, in 
cur.execute("INSERT INTO TestTable VALUES(?)", (i,))
sqlite3.OperationalError: database is locked
i=5
Traceback (most recent call last):
File "l:\Coding\Python\sqlite3test\main.py", line 11, in 
cur.execute("INSERT INTO TestTable VALUES(?)", (i,))
sqlite3.OperationalError: database is locked
i=6
committed i=6
i=7
committed i=7
i=8
И в базе данных есть 1, 2, 3, 6, 7

Подробнее здесь: https://stackoverflow.com/questions/791 ... ng-changes
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»