Python SQLite: база данных заблокирована

Я пробую этот код:

import sqlite

connection = sqlite.connect('cache.db')
cur = connection.cursor()
cur.execute('''create table item
  (id integer primary key, itemno text unique,
        scancode text, descr text, price real)''')

connection.commit()
cur.close()

Я ловлю это исключение:

Traceback (most recent call last):
  File "cache_storage.py", line 7, in <module>
    scancode text, descr text, price real)''')
  File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 237, in execute
    self.con._begin()
  File "/usr/lib/python2.6/dist-packages/sqlite/main.py", line 503, in _begin
    self.db.execute("BEGIN")
_sqlite.OperationalError: database is locked

Полномочия для cache.db в порядке. Какие-либо идеи?

46
задан Soid 29 April 2010 в 21:12
поделиться

5 ответов

Я предполагаю, что вы действительно используете sqlite3, даже если в вашем коде указано иное. Вот некоторые вещи, которые следует проверить:

  1. Что у вас нет зависшего процесса, сидящего в файле (unix: $ fuser cache.db ничего не должен сказать)
  2. Нет кеша .db-файл журнала в каталоге с cache.db; это будет означать сбой сеанса, который не был очищен должным образом.
  3. Попросите оболочку базы данных проверить себя: $ sqlite3 cache.db "pragma integration_check;"
  4. Резервное копирование базы данных $ sqlite3 cache.db ".backup cache.db.bak"
  5. Удалите cache.db, так как у вас, вероятно, ничего нет (если вы только учитесь), и попробуйте еще раз свой код
  6. Проверьте, работает ли резервная копия $ sqlite3 cache.db.bak ".schema"

Ошибка прочтите Вещи, которые могут пойти не так и Как повредить файлы базы данных

47
ответ дан 26 November 2019 в 20:04
поделиться

О, ваша трассировка выдала: у вас конфликт версий. Вы установили старую версию sqlite в свой локальный каталог dist-packages, когда у вас уже есть sqlite3, включенный в ваш дистрибутив python2.6, и вы не нуждаетесь и, вероятно, не можете использовать старую версию sqlite. Сначала попробуйте:

$ python -c "import sqlite3"

и, если это не приведет к ошибке, удалите ваш dist-package :

easy_install -mxN sqlite

, а затем импортируйте sqlite3 в свой код и получайте удовольствие.

1
ответ дан 26 November 2019 в 20:04
поделиться

Одна из возможных причин блокировки базы данных с SQLite я столкнулся, когда пытался получить доступ к строке, которая была записана одним приложением и прочитана другим одновременно. Вы можете установить тайм-аут занятости в вашей оболочке SQLite, который будет вращаться и ждать, пока база данных станет свободной (в исходном c ++ api функция sqlite3_busy_timeout ). Я обнаружил, что в большинстве случаев достаточно 300 мс.

Но я сомневаюсь, что это проблема, судя по вашему сообщению. Сначала попробуйте другие рекомендации.

2
ответ дан 26 November 2019 в 20:04
поделиться

База данных заблокирована другим процессом, который записывает в нее данные. Вам придется подождать, пока другая транзакция не будет зафиксирована. См. документацию по connect()

4
ответ дан 26 November 2019 в 20:04
поделиться

Вот изящный обходной путь для одновременного доступа:

while True:
    connection = sqlite3.connect('user.db', timeout=1)
    cursor = connection.cursor()
    try:
        cursor.execute("SELECT * FROM queue;")
        result = cursor.fetchall()
    except sqlite3.OperationalError:
        print("database locked")
    num_users = len(result)
# ...
4
ответ дан 26 November 2019 в 20:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: