Как я могу игнорировать определенные схемы с 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()