Найти тему
Computer Pro

Работа с миграциями alembic + postgres

Еще одно фото с моего выходного...
Еще одно фото с моего выходного...

В прошлой статье, я создал некий проект для демонстрации работы с базой данных postgresql:

Осталось доделать миграции и можно отправлять работу на проверку. Итак, что же нужно сделать в данной работе:

1. Подключите к проекту Alembic.
2. Создайте init-миграцию и накатите её.
3. Создайте и накатите миграцию по удалению атрибута user.has_sale.
4. Откатите миграцию из п. 3.
5. Создайте и накатите миграцию по добавлению атрибута user.surname.
6. Сделайте имитацию конфликтной ситуации: создайте миграцию по добавлению user.patronomic, в атрибуте down_revision укажите миграцию из п. 2.
7. Накатите миграцию из п. 6 и решите конфликт.

1 и 2. Подключите к проекту Alembic. Создайте init-миграцию и накатите её.

Прежде чем выполнить команду alembic init migrations я дважды проверил что нахожусь в том каталоге что надо, а именно, там где мой проект. Ну а х.з всегда может пойти что-то не так!

-2

Должна появиться директория migrations и файлик alembic.ini

-3

Файл README можно сразу отправить в "цифровой рай" (корзину), просто чтоб не мешался.

Настраиваем файл alembic.ini

Где прописывается подключение к базе данных
Где прописывается подключение к базе данных

А так же env.py:

-5

Пришлось повозиться с импортом Base, все скатывалось на ошибку что алембик не может найти этот Base:

-6

Пробовал различные варианты, и полный путь и маркировать директории и точки в разные места ставить. Оказалось так как мой проект в той же директории что и alembic.ini - никаких особых путей указывать не надо, просто:

from models import Base

После чего все миграции прошли успешно и в папке migrations/versions появился файл первой миграции:

-7

Накатываем миграции...

-8

Наверное можно считать что 1 и 2 задания выполнены, переходим к 3.

3 и 4. Создайте и накатите миграцию по удалению атрибута user.has_sale. После чего откатить эту же миграцию.

То есть нужно удалить поле has_sale и сделать миграцию?! Пробую...

-9
-10
-11
-12

По идее, после того как я накачу данную миграцию, столбец "has_sale" должен исчезнуть из таблицы users:

-13

Да, так и есть колонка удалена:

-14

Теперь нужно откатить все изменения назад, на одну ступень, можно это сделать командой alembic downgrade head

-15

И ничего не произошло, в логах нет строчки Running downgrade, нужно указывать ревизию до которой необходимо откатиться:

-16

Столбец has_sale снова появился, только теперь он пуст:

-17

5.Создайте и накатите миграцию по добавлению атрибута user.surname.

добавлено поле surname
добавлено поле surname
-19

6 и 7 Сделайте имитацию конфликтной ситуации: создайте миграцию по добавлению user.patronomic, в атрибуте down_revision укажите миграцию из самой первой миграции

-20

При попытке накатить спорную миграцию выскочила ошибка, хотя при генерации файла миграции все было норм:

-21

При помощи alembic merge разрешаем спорную ситуацию и повторяем накат:

-22

Ну вот, вроде бы все задания выполнены, можно и на проверку отправить...

На этом у меня всё. Всем удачи в изучении материала! Не поскупитесь на лайк после прочтения.

С подпиской рекламы не будет

Подключите Дзен Про за 159 ₽ в месяц