【问题标题】: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 审查合并请求中的迁移代码变得很容易。希望这可以帮助。