Алембик - самый популярный инструмент для миграции базы данных в связке с SQLAlchemy.
Заключительная статья в серии статей по SQLAlchemy, начало ниже по ссылкам:
Итак, вот вроде бы наш проект написан, есть модели workers, resumes, vacancies. Конфигурация базы данных, движки и прочее. Нужно сделать миграции для этого открываем консоль (я работаю в Pycharm там и открываю консоль). Предполагается что установлены все библиотеки из файла requirements.txt. Посмотреть какие библиотеки у нас уже установлены можно командой pip freeze:
Да, alembic у нас уже установлен. Запускаем инициализацию каталога с миграциями в директорию src:
После чего появляется директория с миграциями (migrations) и файл настроек alembic.ini, в котором нужно добавить директорию src:
Переходим к директории migrations, смотрим файлы: README можно сразу удалить, чтобы не отвлекал внимание, env.py - нужно настроить:
env.py до редактирования:
после редактирования:
Настройки сделаны, можно запустить миграции, запускаю:
alembic revision --autogenerate
...и неудача, фэйл, фиаско братан!
Программа не поняла откуда берется модуль 'config', я попробовал ему дать этот модуль насильно, указав в настройках from src.config import settings. Но и это привело к ошибке. Убрал эту настройку и просто в консоли перешел в каталог src и попробовал снова запустить и снова неудача, alembic не может найти каталог migrations. Я запустил заново инициализацию данного каталога, и пересоздал все настройки, но это не помогло:
Стало понятно, что что-то не так с путями к каталогу с миграциями, может быть alembic.ini??? Ведь мой вариант приложения не в точности повторяет вариант о котором рассказывает Артем Шумейко, он претерпел некоторые изменения...
На этот раз миграции прошли успешно:
В директории migrations/versions появился python-файл:
В отличии от автора ютуб роликов, я не создавал новую базу данных, а остался при существующей, а это не правильно. Нужно создать новую БД и работать с ней иначе эксперимент будет сделан не верно.
Создам пустую базу данных:
Делаем refresh в программе управления базами данных:
И... ничего не произошло, потому что у меня программа DBEaver была изначально настроена только на одну базу данных - "sa". Пересоздал подключение к БД, только на этот раз не указывал название БД, и поставил галочку "показывать все БД" (или что-то в этом духе). После чего баз данных в списке стало больше... в том числе и свежесозданная "sa_alembic" и никаких таблиц там нет:
Изменю DB_NAME:
Дилемма: удалить файл с миграциями или попробовать откатить все (у меня пока ж только одна) миграции. Попробую второе:
Что-то произошло но файл миграций так и остался на том же месте... И повторная миграция ни к чему не привела, удалил файл первой миграции и снова запустил:
И файл миграций стал похож на тот что в видео.
Пока что в базе данных кроме таблицы alembic_version, ничего не появилось, чтобы появились наши таблицы с вакансиями, резюме и работниками (и пр.) нужно выполнить команду:
alembic upgrade head
Посмотрим, как это повлияло на таблицы в БД:
Ну вот, норм, появились таблицы!
Это все гуд, но как быть если мы, допустим, поработали с моделями и поменяли в них что-то и нам нужно сделать upgrade этих изменений, как тогда это будет работать?!
Изменения в модели:
После сделанных изменений в модели:
Откроем файл новой миграции и посмотрим что там создается а что наоборот убирается:
Как можно заметить, про "интервал в 1 день" - программа не заметила. Открываем файл env.py в папке с миграциями и добавляем строчку:
Затем удаляем последнюю миграцию (она еще не вносила ни каких изменений в БД) и снова делаем миграции.
Снова посмотрим файл миграции:
Ну вот, теперь все изменения готовы, осталось только записать их в БД.
А как быть если наши изменения были неправильные и нам нужно откатиться назад, на предыдущую ревизию?! На данный момент предыдущая ревизия у меня 48353a2bbce4, поэтому так и пишу команду отката:
И как можно видеть, поле salary, снова стало "не обязательным":
А если мы хотим сделать откат до самого начала, когда еще не было в базе данных никаких таблиц то выполняется команда:
alembic downgrade base
И остается одна таблица, в которой записываются миграции, и как можно видеть - она пустая:
Так же мы можем самостоятельно создавать миграции, для этого создаем пустую миграцию командой alembic revision, после чего появляется файл миграций с пустыми функциями:
Но так делать не очень удобно. Если alembic не зафиксировал каких то изменений то их можно внести в миграцию самостоятельно а не писать весь код.
Можно еще изменить стиль форматирования кода, раскомментировав строчки в файле alembic.ini:
На прошлом шаге я удалил все таблицы и миграции, поэтому выполню заново все шаги: alembic revision --autogenerate, alembic upgrade head. Но при попытке записать изменения в БД алембик выдал ошибку.
Он не идеален. Он пытается создать тип ENUM который уже существует. Этот тип нужно в ручную прописать в downgrade():
Чуда у меня не произошло, я тут наудалял всякого, в итоге у меня всё сломалось и пришлось заново всё создавать. Теперь всё работает и кстати, фенечка с использованием black в файле alembic.ini сработала и вывела вот такую запись при пересоздании миграций:
И как теперь выглядят наши миграции:
По сравнению с тем что было по умолчанию:
Новый вид более читабелен, на мой взгляд.