【问题标题】:SQLAlchemy Alembic Migration generate SQL scripts at revision step with --autogenerateSQLAlchemy Alembic 迁移使用 --autogenerate 在修订步骤生成 SQL 脚本
【发布时间】:2022-11-10 05:31:19
【问题描述】:

我们使用 SQLAlchemy + Alembic 将迁移生成为 python 代码(Alembic 的默认行为)。
我们希望从 python 转移到 SQL 脚本,因为它提供了对生成脚本的更多控制。
似乎命令 revision --autogenerate 不适用于 --sql 选项。
我们不想使用 updgrade --sql 选项,因为它只是吐出 SQL 脚本但不跟踪它或不能随后与 revision --autogenerate 一起使用
有没有办法自动生成迁移作为 SQL 脚本?

【问题讨论】:

    标签: python sqlalchemy alembic


    【解决方案1】:

    我还没有看到将新迁移自动生成为 SQL 的方法,但我们也希望将迁移保留在 SQL 中并以这种方式处理:

    我们将每个迁移存储为“前向”和“后向”SQL 文件,名称中包含时间戳和修订(添加时间戳只是因为我们希望修订可以按文件名排序)。

    我们使用一个包装外壳脚本来做几件事:

    • 运行alembic 以生成修订版python 文件。我们解析输出以获取修订字符串。
    • <alembic_env>/migration_sql/ 中创建名称类似于YYYYMMDD_HHMM_<revision>_forward.sql 的SQL 文件

    然后我们编写前向和后向(或升级/降级,如果您愿意)SQL DDL。我们更新了<alembic_env>/script.py.mako 以生成时间戳前缀并将其添加到修订文件名(因此我们的修订为YYYYMMDD_HHMM_<revision>_<message_slug>.py)。修订文件中的升级和降级函数 - 在库存 alembic 修订中使用 op.* 函数来描述迁移 - 现在加载正确的 SQL 文件并执行它:

    def upgrade():
        upgrade_file_path = SCRIPTS_DIR / f"{revision_prefix}_{revision}_forward.sql"
        if not os.path.exists(upgrade_file_path):
            print(f"{upgrade_file_path} not found")
            raise Exception(f"{upgrade_file_path} not found, aborting migration")
    
        with open(upgrade_file_path, "r") as upgrade_file:
            sql = upgrade_file.read()
            op.execute(sql)
    

    这需要做一些设置,但效果很好,并且在我们交付之前让 DBA 审查合并请求中的迁移代码变得很容易。希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 1970-01-01
      • 2013-05-25
      • 2019-04-30
      • 2013-06-16
      • 1970-01-01
      • 2012-06-26
      • 1970-01-01
      • 2014-12-02
      相关资源
      最近更新 更多