71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
from typing import TYPE_CHECKING
|
|
|
|
from . import comments
|
|
from . import constraints
|
|
from . import schema
|
|
from . import server_defaults
|
|
from . import tables
|
|
from . import types
|
|
from ... import util
|
|
from ...ext import checkconstraint_byname
|
|
from ...runtime.plugins import Plugin
|
|
|
|
if TYPE_CHECKING:
|
|
from ..api import AutogenContext
|
|
from ...operations.ops import MigrationScript
|
|
from ...operations.ops import UpgradeOps
|
|
|
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
comparators = util.PriorityDispatcher()
|
|
"""global registry which alembic keeps empty, but copies when creating
|
|
a new AutogenContext.
|
|
|
|
This is to support a variety of third party plugins that hook their autogen
|
|
functionality onto this collection.
|
|
|
|
"""
|
|
|
|
|
|
def _populate_migration_script(
|
|
autogen_context: AutogenContext, migration_script: MigrationScript
|
|
) -> None:
|
|
upgrade_ops = migration_script.upgrade_ops_list[-1]
|
|
downgrade_ops = migration_script.downgrade_ops_list[-1]
|
|
|
|
_produce_net_changes(autogen_context, upgrade_ops)
|
|
upgrade_ops.reverse_into(downgrade_ops)
|
|
|
|
|
|
def _produce_net_changes(
|
|
autogen_context: AutogenContext, upgrade_ops: UpgradeOps
|
|
) -> None:
|
|
assert autogen_context.dialect is not None
|
|
|
|
autogen_context.comparators.dispatch(
|
|
"autogenerate", qualifier=autogen_context.dialect.name
|
|
)(autogen_context, upgrade_ops)
|
|
|
|
|
|
Plugin.setup_plugin_from_module(schema, "alembic.autogenerate.schemas")
|
|
Plugin.setup_plugin_from_module(tables, "alembic.autogenerate.tables")
|
|
Plugin.setup_plugin_from_module(types, "alembic.autogenerate.types")
|
|
Plugin.setup_plugin_from_module(
|
|
constraints, "alembic.autogenerate.constraints"
|
|
)
|
|
Plugin.setup_plugin_from_module(
|
|
server_defaults, "alembic.autogenerate.defaults"
|
|
)
|
|
Plugin.setup_plugin_from_module(comments, "alembic.autogenerate.comments")
|
|
# this plugin is opt-in. It lives in the "alembic.ext" namespace rather
|
|
# than "alembic.autogenerate", so that it is not matched by the default
|
|
# "alembic.autogenerate.*" wildcard and must be named explicitly.
|
|
# See #1859 and :ref:`autogenerate_check_constraints`.
|
|
Plugin.setup_plugin_from_module(
|
|
checkconstraint_byname, "alembic.ext.checkconstraint_byname"
|
|
)
|