Невозможно создать таблицу django_migrations (база данных заблокирована) при создании sqlite с нуля - PullRequest
0 голосов
/ 04 мая 2018

У меня есть проект, который работает при запуске с сервером разработки Django. Поэтому я загрузил его на GitHub, затем загрузил в свою среду подготовки и попытался развернуть с Apache2. Но я продолжал получать ошибки заблокированных БД. Мне не нужны были какие-то текущие данные, я бы просто создал новую БД SQLite.

После удаления файла БД и всех файлов миграции, я решил, что начинать все сначала было хорошо. Но когда я запускаю manage.py migrate, я получаю ошибку ниже. Снова говорю, что БД заблокирована.

Unable to create the django_migrations table (database is locked) 

my settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db1.sqlite3'),
    }
}

полное сообщение об ошибке:

Operations to perform:
  Apply all migrations: account, admin, auth, contenttypes, people, sessions, sites, socialaccount
Running migrations:
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/base/base.py", line 239, in _commit
    return self.connection.commit()
sqlite3.OperationalError: database is locked

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/recorder.py", line 55, in ensure_schema
    editor.create_model(self.Migration)
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/sqlite3/schema.py", line 28, in __exit__
    super().__exit__(exc_type, exc_value, traceback)
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/base/schema.py", line 92, in __exit__
    self.atomic.__exit__(exc_type, exc_value, traceback)
  File "/usr/local/lib/python3.5/dist-packages/django/db/transaction.py", line 212, in __exit__
    connection.commit()
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/base/base.py", line 261, in commit
    self._commit()
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/base/base.py", line 239, in _commit
    return self.connection.commit()
  File "/usr/local/lib/python3.5/dist-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/base/base.py", line 239, in _commit
    return self.connection.commit()
django.db.utils.OperationalError: database is locked

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/base.py", line 335, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/commands/migrate.py", line 200, in handle
    fake_initial=fake_initial,
  File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/executor.py", line 91, in migrate
    self.recorder.ensure_schema()
  File "/usr/local/lib/python3.5/dist-packages/django/db/migrations/recorder.py", line 57, in ensure_schema
    raise MigrationSchemaMissing("Unable to create the django_migrations table (%s)" % exc)
django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table (database is locked)

вопрос : Как заблокировать базу данных и, что более важно, как создать новую базу данных?

Спасибо

1 Ответ

0 голосов
/ 04 мая 2018

Причина:

«База данных заблокирована» ошибки¶

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

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

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

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

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

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

'OPTIONS': {
        # ...
        'timeout': 20,
        # ...
    }

Это просто заставит SQLite подождать немного дольше, прежде чем выдавать ошибки «база данных заблокирована»; на самом деле он ничего не сделает для их решения.

Методы решения:

  1. Удалить файл db1.sqlite3. Также закройте браузер SQLite (если он открыт для db1.sqlite3). Затем попробуйте снова migrate.

  2. Перенос на другую БД, так как SQLite3 не подходит для производства. Вам нужно будет сделать это в будущем, поэтому попробуйте это сейчас. (Предпочтение: Mysql) Ссылка для подключения приложения с MySQL

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