Alembic не поддерживает асинхронные операции "из коробки", так как он предназначен для синхронной работы с базой данных. Однако с помощью некоторых оберток и подходов можно использовать Alembic даже в асинхронном контексте.
Чтобы запускать миграции Alembic при старте и остановке приложения FastAPI, можно использовать события "startup" и "shutdown" и асинхронный context manager. Ниже приведен пример того, как это можно сделать:
1. Создайте функции апгрейда и даунгрейда:
```python
from alembic.config import Config
from alembic import command
async def run_async_migrations():
"""Запустить асинхронную миграцию вверх (upgrade)."""
alembic_cfg = Config('alembic.ini')
command.upgrade(alembic_cfg, 'head')
async def revert_async_migrations():
"""Запустить асинхронную миграцию вниз (downgrade)."""
alembic_cfg = Config('alembic.ini')
command.downgrade(alembic_cfg, 'base')
```
2. Инициализируйте и очистите ваши миграции в контекстном менеджере, используя FastAPI события "startup" и "shutdown".
```python
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.on_event("startup")
async def startup_event():
loop = asyncio.get_running_loop()
# Запускаем апгрейд в событии startup
await loop.run_in_executor(None, run_async_migrations)
@app.on_event("shutdown")
async def shutdown_event():
loop = asyncio.get_running_loop()
# Запускаем даунгрейд в событии shutdown (если необходимо)
await loop.run_in_executor(None, revert_async_migrations)
```
Таким образом, `loop.run_in_executor` используется для запуска синхронных функций миграции в асинхронном контексте. Обратите внимание, что автоматический даунгрейд при остановке приложения может быть не лучшим решением для продакшн-среды, так как он может привести к потере данных. Этот шаг стоит применять с осторожностью и только там, где это допустимо и определено требованиями к приложению.
Кроме того, общая практика заключается в ручном управлении миграциями, чтобы иметь более тонкий контроль над процессом и избежать потенциальных ошибок в продакшн-среде.