Найти в Дзене
Computer Pro

SQLAlchemy + Alembic - Как делать Миграции Базы Данных на Python #11

Алембик - самый популярный инструмент для миграции базы данных в связке с SQLAlchemy.

Заключительная статья в серии статей по SQLAlchemy, начало ниже по ссылкам:

Итак, вот вроде бы наш проект написан, есть модели workers, resumes, vacancies. Конфигурация базы данных, движки и прочее. Нужно сделать миграции для этого открываем консоль (я работаю в Pycharm там и открываю консоль). Предполагается что установлены все библиотеки из файла requirements.txt. Посмотреть какие библиотеки у нас уже установлены можно командой pip freeze:

-2

Да, alembic у нас уже установлен. Запускаем инициализацию каталога с миграциями в директорию src:

-3

После чего появляется директория с миграциями (migrations) и файл настроек alembic.ini, в котором нужно добавить директорию src:

-4

Переходим к директории migrations, смотрим файлы: README можно сразу удалить, чтобы не отвлекал внимание, env.py - нужно настроить:

env.py до редактирования:

после редактирования:

Убраны все лишние комментарии и добавлены необходимые настройки. В отличии от оригинала, ютубного ролика - я использую синхронный вариант кода (потому что я так и пока не знаю в чем разница между синхронным и асинхронным кроме как в использовании ключевых слов async и await)
Убраны все лишние комментарии и добавлены необходимые настройки. В отличии от оригинала, ютубного ролика - я использую синхронный вариант кода (потому что я так и пока не знаю в чем разница между синхронным и асинхронным кроме как в использовании ключевых слов async и await)

Настройки сделаны, можно запустить миграции, запускаю:

alembic revision --autogenerate

...и неудача, фэйл, фиаско братан!

-7

Программа не поняла откуда берется модуль 'config', я попробовал ему дать этот модуль насильно, указав в настройках from src.config import settings. Но и это привело к ошибке. Убрал эту настройку и просто в консоли перешел в каталог src и попробовал снова запустить и снова неудача, alembic не может найти каталог migrations. Я запустил заново инициализацию данного каталога, и пересоздал все настройки, но это не помогло:

-8

Стало понятно, что что-то не так с путями к каталогу с миграциями, может быть alembic.ini??? Ведь мой вариант приложения не в точности повторяет вариант о котором рассказывает Артем Шумейко, он претерпел некоторые изменения...

убрал из файла настроек src в двух местах
убрал из файла настроек src в двух местах

На этот раз миграции прошли успешно:

-10

В директории migrations/versions появился python-файл:

-11

В отличии от автора ютуб роликов, я не создавал новую базу данных, а остался при существующей, а это не правильно. Нужно создать новую БД и работать с ней иначе эксперимент будет сделан не верно.

Создам пустую базу данных:

-12

Делаем refresh в программе управления базами данных:

-13

И... ничего не произошло, потому что у меня программа DBEaver была изначально настроена только на одну базу данных - "sa". Пересоздал подключение к БД, только на этот раз не указывал название БД, и поставил галочку "показывать все БД" (или что-то в этом духе). После чего баз данных в списке стало больше... в том числе и свежесозданная "sa_alembic" и никаких таблиц там нет:

-14

Изменю DB_NAME:

-15

Дилемма: удалить файл с миграциями или попробовать откатить все (у меня пока ж только одна) миграции. Попробую второе:

-16

Что-то произошло но файл миграций так и остался на том же месте... И повторная миграция ни к чему не привела, удалил файл первой миграции и снова запустил:

-17
-18

И файл миграций стал похож на тот что в видео.

-19
-20

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

alembic upgrade head

-21

Посмотрим, как это повлияло на таблицы в БД:

-22

Ну вот, норм, появились таблицы!

Это все гуд, но как быть если мы, допустим, поработали с моделями и поменяли в них что-то и нам нужно сделать upgrade этих изменений, как тогда это будет работать?!

Изменения в модели:

-23
-24

После сделанных изменений в модели:

-25

Откроем файл новой миграции и посмотрим что там создается а что наоборот убирается:

-26

Как можно заметить, про "интервал в 1 день" - программа не заметила. Открываем файл env.py в папке с миграциями и добавляем строчку:

-27

Затем удаляем последнюю миграцию (она еще не вносила ни каких изменений в БД) и снова делаем миграции.

как можно заметить, второе изменение в модели, так же обнаружено!
как можно заметить, второе изменение в модели, так же обнаружено!

Снова посмотрим файл миграции:

-29

Ну вот, теперь все изменения готовы, осталось только записать их в БД.

-30
-31
Теперь колонка salary стала обязательной
Теперь колонка salary стала обязательной

А как быть если наши изменения были неправильные и нам нужно откатиться назад, на предыдущую ревизию?! На данный момент предыдущая ревизия у меня 48353a2bbce4, поэтому так и пишу команду отката:

-33

И как можно видеть, поле salary, снова стало "не обязательным":

-34

А если мы хотим сделать откат до самого начала, когда еще не было в базе данных никаких таблиц то выполняется команда:

alembic downgrade base

-35

И остается одна таблица, в которой записываются миграции, и как можно видеть - она пустая:

-36

Так же мы можем самостоятельно создавать миграции, для этого создаем пустую миграцию командой alembic revision, после чего появляется файл миграций с пустыми функциями:

-37

Но так делать не очень удобно. Если alembic не зафиксировал каких то изменений то их можно внести в миграцию самостоятельно а не писать весь код.

Можно еще изменить стиль форматирования кода, раскомментировав строчки в файле alembic.ini:

почему то подчеркивает красным...
почему то подчеркивает красным...

На прошлом шаге я удалил все таблицы и миграции, поэтому выполню заново все шаги: alembic revision --autogenerate, alembic upgrade head. Но при попытке записать изменения в БД алембик выдал ошибку.

-39

Он не идеален. Он пытается создать тип ENUM который уже существует. Этот тип нужно в ручную прописать в downgrade():

-40

Чуда у меня не произошло, я тут наудалял всякого, в итоге у меня всё сломалось и пришлось заново всё создавать. Теперь всё работает и кстати, фенечка с использованием black в файле alembic.ini сработала и вывела вот такую запись при пересоздании миграций:

-41

И как теперь выглядят наши миграции:

-42

По сравнению с тем что было по умолчанию:

-43

Новый вид более читабелен, на мой взгляд.

Ну а на этом я закончу цикл статей по SQLAlchemy. Еще осталось очень много всего "за кадром" и еще есть много чему поучиться. Это были лишь базовые понятия и темы.
Всем желаю лёгкого изучения предмета!