Python SQLite: база данных заблокирована - PullRequest
42 голосов
/ 30 апреля 2010

Я пытаюсь этот код:

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 в порядке. Есть идеи?

Ответы [ 16 ]

2 голосов
/ 17 января 2017
  1. Ваш cache.db в настоящее время используется другим процессом.
  2. Остановите этот процесс и попробуйте снова, он должен работать.
2 голосов
/ 30 апреля 2010

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

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

1 голос
/ 06 мая 2018

У меня была эта проблема при работе с Pycharm и с базой данных, которая была первоначально предоставлена ​​мне другим пользователем.

Итак, вот как я решаю это в моем случае:

  1. Закрыты все вкладки в Pycharm, которые работают с проблемной базой данных.
  2. Остановите все запущенные процессы из нижней части красного квадрата в правом верхнем углу Pycharm.
  3. Удалить проблемную базу данных из каталога.
  4. Загрузите снова исходную базу данных. И это снова сработало.
1 голос
/ 21 сентября 2016

У меня была такая же проблема: sqlite3.IntegrityError

Как упоминалось во многих ответах, проблема в том, что соединение не было правильно закрыто.

В моем случае у меня было try except блоков. Я обращался к базе данных в блоке try, и когда возникло исключение, я хотел сделать что-то еще в блоке except.

try:
    conn = sqlite3.connect(path)
    cur = conn.cursor()
    cur.execute('''INSERT INTO ...''')
except:
    conn = sqlite3.connect(path)
    cur = conn.cursor()
    cur.execute('''DELETE FROM ...''')
    cur.execute('''INSERT INTO ...''')

Однако при возникновении исключения соединение из блока try имело , а не было закрыто .

Я решил это с помощью with операторов внутри блоков.

try:
    with sqlite3.connect(path) as conn:
        cur = conn.cursor()
        cur.execute('''INSERT INTO ...''')
except:
    with sqlite3.connect(path) as conn:
        cur = conn.cursor()
        cur.execute('''DELETE FROM ...''')
        cur.execute('''INSERT INTO ...''')
1 голос
/ 30 апреля 2010

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

$ python -c "import sqlite3"

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

easy_install -mxN sqlite

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

0 голосов
/ 10 февраля 2018

У меня тоже была эта проблема. Я пытался ввести данные в базу данных без сохранения внесенных в нее изменений. после того как я сохранил изменения работали

...