Skip to main content

Миграции

Создание первой (пустой) миграции.

После создания пустой миграции, в БД создастся таблица alembic_version в которой хранится идентификатор текущей версии.

alembic revision -m "Empty Init"

Обновление базы данных после создания миграции

alembic upgrade head

Хэш текущей миграции

alembic current

История миграций.

Считываются все файлы миграций. Т.е. в случае загрузки предыдущего состояния, последующие миграции будут отображаться до тех пор, пока ненужные файлы миграций не будут удалены.

alembic history

Возврат к предыдущему состоянию

alembic downgrade migration_id

Для возврата в стартовое состояние, нужно выполнить 

alembic downgrade base

Если что-то пошло не так, для возврата в нулевое состояние нужно удалить из таблицы alembic_version текущий номер.

DELETE FROM public.alembic_version;

Пропуск состояния

alembic stamp migration_id

Экспорт в формате sql 

alembic upgrade migration_id_start:migration_id_stop --sql > migration.sql

Автогенерация миграции

alembic revision --autogenerate -m "Added Cookie model"

Поддерживаемые и неподдерживаемые действия при автоматической миграции

Тип элемента Поддерживаемые Неподдерживаемые
Таблицы Добавление и удаление Изменение имени
Столбец Добавление, удаление, изменение нулевого статуса на столбце Изменение имени
Индекс Основные изменения в индексах и явно обозначенных уникальных ограничениях, поддержка автоматической генерации индексов
и уникальных ограничений

Ограничения
Ограничения без явного имени
Ключи Переименование
Типы
Типы, которые явно не поддерживаются базой данных

Чтобы alembic увидел класс данных, необходимо его непосредственно импортировать. Импорт всей директории не работает.

Ручное создание миграций

На примере изменения имени таблицы

  • Изменить имя.
  • Выполнить генерацию миграции
alembic revision -m "Renaming table"
  • В созданном файле изменить upgrade/downgrade
def upgrade():
    op.rename_table('old_name', 'new_name')
def downgrade():
    op.rename_table('new_name', 'old_name')
  • Выполнить миграцию
alembic upgrade head

Команды alembic

add_column Добавить столбец
alter_column Изменить тип столбца, имя или значение по-умолчанию
create_check_constraint Добавить ограничение
create_foreign_key Добавить внешний ключ
create_index Создать индекс
create_primary_key Создать основной ключ
create_table Создать таблицу
create_unique_constraint Создать ограничение уникальности
drop_column Удалить столбец
drop_constraint Удалить ограничение
drop_index Удалить индекс
drop_table Удалить таблицу
execute Выполнить сырую SQL команду
rename_table Переименовать таблицу