Django — работа с миграциями

В прошлом уроке мы создали модель Post в приложении Posts. Пока что эта модель — просто код, связи с базой данных у неё нет. Да и самой БД тоже нет. Пора её создать и подключить к проекту. В файле yatube/setting.py есть опция DATABASES:

# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databases

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

Django умеет работать с разными базами данных, и в свойстве ENGINE указано, какой драйвер баз данных использует проект; в нашем проекте это будет SQLite. Эта база была автоматически установлена на вашем компьютере вместе с Python.Свойство NAME указывает, что файл с базой данных будет создан в головной директории проекта и будет называться db.sqlite3. При первом запуске сервера Django пытался прочитать содержимое базы данных, не нашёл её и предупредил, что БД не подготовлена для работы: выдал системное сообщение You have 17 unapplied migration(s). Это сообщение информирует, что файл БД пуст или в нём не созданы необходимые таблицы. С этим нужно что-то делать.Запустите сервер разработчика: в командной строке из директории Yatube/yatube выполните команду (venv) $ python manage.py runserver:

(venv) $ python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

October 01, 2020 - 10:59:42
Django version 2.2, using settings 'yatube.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C. 

Будем исправлять ситуацию.

Миграция данных

В Django изначально есть некоторое количество встроенных моделей, которые нужны для работы системы, но в БД таблицы для них ещё не созданы. Можно создать таблицы «ручками»: написать SQL-запрос на создание таблиц, указать имена и типы полей для каждой таблицы и т. д. А можно командой из терминала запустить миграцию — автоматический процесс обновления базы данных на основании определённых правил.При запуске миграции Django проверит все модели в коде и сопоставит их с существующими таблицами в БД. Если для какой-то модели таблицы нет, Django создаст её. А если таблица не соответствует модели, то Django изменит её, чтобы привести в соответствие с этой моделью.

Создание и запуск скриптов миграции

Миграции проводятся в два этапа:

  1. Первым делом запускается команда makemigrations, Django проверяет модели и таблицы в БД, анализирует их на соответствие друг другу, подготавливает скрипты миграций и сообщает, какие миграции необходимо применить; однако никаких изменений в БД в этот момент не вносится.
  2. Затем запускается команда migrate, и в этот момент все изменения вносятся в БД.

Из директории Yatube/yatube запустите команду создания скрипта миграций makemigrations. Консоль вернёт примерно такой ответ:

(venv) $ python manage.py makemigrations

Migrations for 'posts':
  posts/migrations/0001_initial.py
    - Create model Post 

В приложении Posts в папке migrations будет создан файл со скриптом миграции: в нём сохранено описание моделей, найденных в этом приложении. Для встроенных моделей такие скрипты были созданы при установке Django. Миграции, о которых Django сообщал при запуске сервера, в этом сообщении не упомянуты: скрипты миграций для них были созданы заранее. Теперь нужно запустить все миграции. Выполните команду migrate:

(venv) $ python manage.py migrate       
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, posts, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying posts.0001_initial... OK
  Applying sessions.0001_initial... OK 

OK обозначает, что операция успешно завершена. Вот они, те 17 исправлений, которых недоставало при запуске проекта.Теперь к проекту Yatube подключена база данных, в неё добавлены таблицы служебных приложений, создана таблица для приложения Posts. Создали модель, запустили миграцию — и всё готово для сохранения постов пользователей.





Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: