OperationalError: база данных заблокирована - PullRequest
36 голосов
/ 04 июля 2010

Я сделал несколько повторяющихся операций в своем приложении (тестировал его), и внезапно я получаю странную ошибку:

OperationalError: database is locked

Я перезапустил сервер, но ошибка не исчезла. О чем это может быть?

Ответы [ 10 ]

57 голосов
/ 04 июля 2010

Из django doc:

SQLite является облегченной базой данных и поэтому не может поддерживать высокий уровень параллелизма.OperationalError: база данных заблокирована. Ошибки указывают на то, что ваше приложение испытывает больше параллелизма, чем sqlite может обработать в конфигурации по умолчанию.Эта ошибка означает, что один поток или процесс имеет монопольную блокировку соединения с базой данных, а другой поток истек тайм-аут в ожидании снятия блокировки.

Оболочка SQLite Python имеет значение тайм-аута по умолчанию, которое определяет, как долго второй потокразрешено ждать блокировки до истечения времени ожидания и вызывает ошибку OperationalError: database заблокирована ошибка.

Если вы получаете эту ошибку, вы можете устранить ее следующим образом:

Переключение на другуюбаза данныхВ определенный момент SQLite становится слишком «легким» для реальных приложений, и такого рода ошибки параллелизма указывают, что вы достигли этой точки.

Переписывание кода для уменьшения параллелизма и обеспечения коротких транзакций базы данных.жил.

Увеличьте значение тайм-аута по умолчанию, установив опцию базы данных тайм-аутов optionoption

http://docs.djangoproject.com/en/dev/ref/databases/#database-is-locked-errorsoption

23 голосов
/ 22 октября 2013

Практическая причина этого часто заключается в том, что оболочки python или django открыли запрос к БД, и он не был закрыт должным образом;уничтожение доступа к терминалу часто освобождает его.У меня была эта ошибка при запуске тестов командной строки сегодня.

Редактировать: я получаю периодические откаты по этому вопросу.Если вы хотите заблокировать доступ без перезагрузки терминала, то из командной строки вы можете сделать:

from django import db
db.connections.close_all()
13 голосов
/ 12 сентября 2016

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

4 голосов
/ 25 ноября 2018

Я не согласен с ответом @ Patrick, который, цитируя этот документ, неявно связывает проблему OP (Database is locked) с этим:

Переключение на другой сервер базы данных.В определенный момент SQLite становится слишком «легким» для реальных приложений, и такого рода ошибки параллелизма указывают на то, что вы достигли этой точки.

Это немного «слишком просто», чтобы обвинить SQliteдля этой проблемы.Если у вас не очень загруженный сервер с тысячами подключений в одну секунду, причина этой ошибки Database is locked, вероятно, скорее неправильное использование API, чем проблема, свойственная SQlite, которая была бы "слишком легкой".Вот больше информации о Пределах реализации для SQLite .


Теперь решение:

У меня была та же проблема, когда я использовал два скрипта, использующих одну и ту же базу данныхв то же время:

  • один обращался к БД с операциями записи
  • другой обращался к БД только для чтения

Решение: всегда выполняйте cursor.close() как можно скорее после выполнения запроса (даже для чтения).

Подробнее см. .

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

Как уже говорили другие, существует другой процесс, который использует файл SQLite и не закрыл соединение.Если вы используете Linux, вы можете увидеть, какие процессы используют файл (например, db.sqlite3), с помощью команды fuser следующим образом:

$ sudo fuser -v db.sqlite3
                     USER        PID ACCESS COMMAND
/path/to/db.sqlite3:
                     user    955 F.... apache2

Если вы хотите остановить процессы для выпускаДля блокировки используйте fuser -k, который отправляет сигнал KILL всем процессам, обращающимся к файлу:

sudo fuser -k db.sqlite3

Обратите внимание, что это опасно, так как это может остановить процесс веб-сервера на рабочем сервере.*

Спасибо @ cz-game за указание на fuser!

1 голос
/ 06 февраля 2019

Для меня это решается, как только я закрыл оболочку django, которая была открыта с помощью python manage.py shell

1 голос
/ 07 января 2019

Это также может произойти, если вы подключены к своей базе данных sqlite через плагин dbbrowser через pycharm. Отключение решит проблему

0 голосов
/ 18 апреля 2019

ОБНОВЛЕНИЕ Django версия 2.1.7

Я получил эту ошибку sqlite3.OperationalError: database is locked, используя pytest с django.

Решение:

Если мы используем @pytest.mark.django_db декоратор. Что он делает, это создает in-memory-db для тестирования.

Имени: file:memorydb_default?mode=memory&cache=shared Мы можем получить это имя с:

from django.db import connection
db_path = connection.settings_dict['NAME']

Чтобы получить доступ к этой базе данных, а также отредактировать ее, выполните:

Подключение к базе данных:

with sqlite3.connect(db_path, uri=True) as conn:
    c = conn.cursor()

Используйте uri=True для указания файла диска, который является базой данных SQLite, которую нужно открыть.

Во избежание ошибки активируйте транзакции в декораторе:

@pytest.mark.django_db(transaction=True)

Финальная функция:

from django.db import connection

@pytest.mark.django_db(transaction=True)
def test_mytest():
    db_path = connection.settings_dict['NAME']
    with sqlite3.connect(db_path, uri=True) as conn:
        c = conn.cursor()
        c.execute('my amazing query')
        conn.commit()
    assert ... == ....
0 голосов
/ 14 сентября 2018

В моем случае я не сохранил операцию базы данных, которую выполнил в браузере SQLite.Сохранение решило проблему.

0 голосов
/ 15 января 2018

попробуйте эту команду:

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