【问题标题】:How to migrate SQLAlchemy database without generating migration script如何在不生成迁移脚本的情况下迁移 SQLAlchemy 数据库
【发布时间】:2021-07-15 05:23:24
【问题描述】:

我在无服务器函数中使用 Flask 和 SQLAlchemy,我无法访问命令行。有时我想更换桌子。基本上我想自动创建新表(已经由create_all完成)和列,以及更改列(例如更长的字符串)。

如何迁移 SQLAlchemy 数据库而不在命令行中生成迁移脚本?如果我可以查看要完成的任务(例如 [添加 A 列,删除表 B])会更好。

【问题讨论】:

    标签: flask sqlalchemy alembic flask-migrate


    【解决方案1】:

    是的,可以使用 alembic 而不是很 hacky。

    我使用 alembic autogenerate APIcompare_metadata方便生成diff查看,produce_migrations方便生成迁移操作,而不是Opertaions.invoke调用。

    需要注意的一点是upgrade_ops 可能包含OpContainer,它本身不是invoke-able,但具有包含嵌套操作的ops 属性。

    以下是我实现此目的的代码:

    @bp.route("/migrate", methods=["GET", "POST"])
    def migrate():
        from alembic.runtime.migration import MigrationContext
    
        # use `db.session.connection()` instead of `db.engine.connect()`
        # to avoid database lock hang
        context = MigrationContext.configure(db.session.connection())
    
        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)
        return respond_success()
    

    对于阅读本文的任何人,如果您想确保已审核的操作与要调用的操作相同,请尝试发布 diff_str 的哈希并进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多