Files
vidconf/backend/alembic/env.py

94 lines
3.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import asyncio
from logging.config import fileConfig
from sqlalchemy import pool
from sqlalchemy.engine import Connection
from sqlalchemy.ext.asyncio import async_engine_from_config
from alembic import context
from core.config import get_settings
from models import Base
# это объект конфига Alembic, который предоставляет
# доступ к значениям в используемом .ini файле.
config = context.config
# Интерпретировать конфиг файл для Python логирования.
# Эта строка устанавливает логгеры в основном.
if config.config_file_name is not None:
fileConfig(config.config_file_name)
# Использовать Settings приложения (переменные окружения / .env) вместо alembic.ini
# для URL БД.
config.set_main_option("sqlalchemy.url", get_settings().database_url)
# добавить объект MetaData вашей модели здесь
# для поддержки 'autogenerate'
target_metadata = Base.metadata
# другие значения конфига, определённые потребностями env.py,
# можно получить:
# my_important_option = config.get_main_option("my_important_option")
# ... и т.д.
def run_migrations_offline() -> None:
"""Запустить миграции в 'offline' режиме.
Это настраивает контекст только с URL
и без Engine, хотя Engine также приемлем
здесь. Пропуская создание Engine
нам даже не нужен доступный DBAPI.
Вызовы context.execute() здесь выдают заданную строку в
вывод скрипта.
"""
url = config.get_main_option("sqlalchemy.url")
context.configure(
url=url,
target_metadata=target_metadata,
literal_binds=True,
dialect_opts={"paramstyle": "named"},
)
with context.begin_transaction():
context.run_migrations()
def do_run_migrations(connection: Connection) -> None:
context.configure(connection=connection, target_metadata=target_metadata)
with context.begin_transaction():
context.run_migrations()
async def run_async_migrations() -> None:
"""В этом сценарии нам нужно создать Engine
и связать подключение с контекстом.
"""
connectable = async_engine_from_config(
config.get_section(config.config_ini_section, {}),
prefix="sqlalchemy.",
poolclass=pool.NullPool,
)
async with connectable.connect() as connection:
await connection.run_sync(do_run_migrations)
await connectable.dispose()
def run_migrations_online() -> None:
"""Запустить миграции в 'online' режиме."""
asyncio.run(run_async_migrations())
if context.is_offline_mode():
run_migrations_offline()
else:
run_migrations_online()