Как я могу игнорировать определенные схемы с alembic --autogenerate

У меня есть библиотека, которая является частью большого проекта. Библиотека использует свою собственную схему в базе данных (PostgreSQL), используемой совместно с более крупным проектом.

Я хочу использовать alembic revision --autogenerate генерировать только миграции для схемы библиотеки и игнорировать изменения таблиц в схеме main/default. Есть ли вариант сделать это?

FWIW, я пробовал include_schemas=False параметр в context.configure в env.py, но, похоже, он ничего не делает.

4 ответа

Решение

Кажется, я могу использовать include_object в сочетании с include_schemas

В alembic/env.py:

def include_object(object, name, type_, reflected, compare_to):
    if type_ == 'table' and object.schema != MY_SCHEMA:
        return False

    return True

...
context.configure(..., include_object=include_object, ...)

На основе ответа Oin, наконец, метод, который игнорирует таблицы при запуске ревизии db --autogenerate

В alembic/env.py или migrations/env.py:

def include_object(object, name, type_, reflected, compare_to):
    if (type_ == "table" and object.schema == "exclude_from_migrations"):
        return False
    else:
       return True

В alembic/env.py или migrations/env.py:

def run_migrations_online():
   ....
   context.configure(connection=connection,
                  target_metadata=target_metadata,
                  include_object = include_object,
                  process_revision_directives=process_revision_directives,
                  **current_app.extensions['migrate'].configure_args)
   ...

Теперь в таблицах, которые вы хотите игнорировать:

class MyClass(db.Model):
__tablename__='my_class'
__table_args__ = {"schema": "exclude_from_migrations"}

Попробуйте использовать include_name: https://alembic.sqlalchemy.org/en/latest/api/runtime.html#alembic.runtime.environment.EnvironmentContext.configure.params.include_name

Это новый хук, добавленный в alembic==1.5, и это рекомендуемый способ отфильтровать схемы во время autogenerate:

Для случая использования исключения определенных схем из целевой базы данных, когда EnvironmentContext.configure. Для include_schemas установлено значение True, атрибут схемы можно проверить для каждого объекта Table, переданного в ловушку, однако гораздо эффективнее фильтровать схемы до того, как произойдет отражение объектов, с помощью EnvironmentContext.configure. include_name ловушка.

Связанное обсуждение:https://github.com/sqlalchemy/alembic/issues/650

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

      def include_name(name, type_, parent_names):
    if type_ == "schema":
        return name not in settings.POSTGRES_IGNORE_SCHEMAS
    else:
        return True

def run_migrations_offline():
    context.configure(
        include_name=include_name,
        url=get_url(),
        target_metadata=target_metadata,
        literal_binds=True,
        compare_type=True,
        include_schemas=True
    )

    with context.begin_transaction():
        context.run_migrations()
Другие вопросы по тегам