# Миграции

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

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

```bash
alembic revision -m "Empty Init"
```

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

```bash
alembic upgrade head
```

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

```bash
alembic current
```

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

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

```bash
alembic history
```

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

```bash
alembic downgrade migration_id
```

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

```bash
alembic downgrade base
```

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

```sql
DELETE FROM public.alembic_version;
```

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

```bash
alembic stamp migration_id
```

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

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

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

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

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

<table border="1" id="bkmrk-%D0%A2%D0%B8%D0%BF-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0-%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 14.1836%;"></col><col style="width: 45.0624%;"></col><col style="width: 40.754%;"></col></colgroup><thead><tr><td>Тип элемента</td><td>Поддерживаемые</td><td>Неподдерживаемые</td></tr></thead><tbody><tr><td>Таблицы</td><td>Добавление и удаление</td><td>Изменение имени</td></tr><tr><td>Столбец</td><td>Добавление, удаление, изменение нулевого статуса на столбце</td><td>Изменение имени</td></tr><tr><td>Индекс</td><td>Основные изменения в индексах и явно обозначенных уникальных ограничениях, поддержка автоматической генерации индексов  
и уникальных ограничений</td><td>  
</td></tr><tr><td>Ограничения</td><td>  
</td><td>Ограничения без явного имени</td></tr><tr><td>Ключи</td><td>Переименование</td><td>  
</td></tr><tr><td>Типы</td><td>  
</td><td>Типы, которые явно не поддерживаются базой данных</td></tr></tbody></table>

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

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

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

- Изменить имя.
- Выполнить генерацию миграции

```bash
alembic revision -m "Renaming table"
```

- В созданном файле изменить upgrade/downgrade

```python
def upgrade():
    op.rename_table('old_name', 'new_name')
def downgrade():
    op.rename_table('new_name', 'old_name')
```

- Выполнить миграцию

```bash
alembic upgrade head
```

**Команды alembic**

<table border="1" id="bkmrk-add_column-%D0%94%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 23.512%;"></col><col style="width: 76.6072%;"></col></colgroup><tbody><tr><td>add\_column</td><td>Добавить столбец</td></tr><tr><td>alter\_column</td><td>Изменить тип столбца, имя или значение по-умолчанию</td></tr><tr><td>create\_check\_constraint</td><td>Добавить ограничение</td></tr><tr><td>create\_foreign\_key</td><td>Добавить внешний ключ</td></tr><tr><td>create\_index</td><td>Создать индекс</td></tr><tr><td>create\_primary\_key</td><td>Создать основной ключ</td></tr><tr><td>create\_table</td><td>Создать таблицу</td></tr><tr><td>create\_unique\_constraint</td><td>Создать ограничение уникальности</td></tr><tr><td>drop\_column</td><td>Удалить столбец</td></tr><tr><td>drop\_constraint</td><td>Удалить ограничение</td></tr><tr><td>drop\_index</td><td>Удалить индекс</td></tr><tr><td>drop\_table</td><td>Удалить таблицу</td></tr><tr><td>execute</td><td>Выполнить сырую SQL команду</td></tr><tr><td>rename\_table</td><td>Переименовать таблицу</td></tr></tbody></table>