def replace(cls, operations: Operations, target, replaces=None, replace_with=None) -> None: if replaces: old_obj = cls._get_object_from_version(operations, replaces) drop_old = cls(old_obj).reverse() create_new = cls(target) elif replace_with: old_obj = cls._get_object_from_version(operations, replace_with) drop_old = cls(target).reverse() create_new = cls(old_obj) else: raise TypeError("replaces or replace_with is required") operations.invoke(drop_old) operations.invoke(create_new)
def replace(cls, operations: Operations, target, replaces=None, replace_with=None) -> None: if replaces: old_obj = cls._get_object_from_version(operations, replaces) drop_old = cls(old_obj).reverse() create_new = cls(target) elif replace_with: old_obj = cls._get_object_from_version(operations, replace_with) drop_old = cls(target).reverse() create_new = cls(old_obj) else: raise TypeError("replaces or replace_with is required") operations.invoke(drop_old) operations.invoke(create_new)
def migrate(): from alembic.runtime.migration import MigrationContext # use `db.session.connection()` instead of `db.engine.connect()` # to avoid lock hang context = MigrationContext.configure( db.session.connection(), opts={ "compare_type": True, }, ) if request.method == "GET": import pprint from alembic.autogenerate import compare_metadata diff = compare_metadata(context, db.metadata) diff_str = pprint.pformat(diff, indent=2, width=20) logger.info("Migrate steps: %s", diff_str) return respond_success(migration=diff_str) from alembic.autogenerate import produce_migrations from alembic.operations import Operations from alembic.operations.ops import OpContainer migration = produce_migrations(context, db.metadata) operation = Operations(context) for outer_op in migration.upgrade_ops.ops: logger.info("Invoking %s", outer_op) if isinstance(outer_op, OpContainer): for inner_op in outer_op.ops: logger.info("Invoking %s", inner_op) operation.invoke(inner_op) else: operation.invoke(outer_op) db.session.commit() db.session.close() return respond_success()
def invoke_for_target(cls, operations: Operations, target): op = cls(target) return operations.invoke(op)
def invoke_for_target(cls, operations: Operations, target): op = cls(target) return operations.invoke(op)