如何以编程方式设置 Alembic 所需的 'target_metadata' 以与命令 API 一起使用?

How can I programmatically set the 'target_metadata' required by Alembic for use with the command API?

我正在使用 Alembic and would like to use the default files generated by alembic init without any modifications to env.py (e.g., setting target_metadata) or alembic.ini (e.g., setting sqlalchemy.url) 管理数据库迁移,以便从脚本管理我的数据库迁移。

例如,我想使用基于 command 的脚本,如下所示:

import os

from alembic.config import Config
from alembic import command
from myapp import db

alembic_cfg = Config(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'alembic.ini'))
alembic_cfg.set_main_option("sqlalchemy.url",
                            os.environ['DATABASE_URL'])
alembic_cfg.set_main_option("script_location",
                            os.path.join(os.path.abspath(os.path.dirname(__file__)), '.db_migrations'))
alembic_cfg.set_main_option("target_metadata", db.metadata) # This doesn't work!

command.revision(alembic_cfg, message='Test of new system', autogenerate=True)
command.upgrade(alembic_cfg, 'head')

这一切都按预期工作,除了指示的行失败,而且我没有看到设置target_metadata的方法(除了编辑env.py).

如何在上面的脚本中(类似于)以编程方式设置 Alembic 所需的 target_metadata,它使用 Alembic 的命令 API?

长答案是您不在那里设置元数据,而是在创建 MigrationContext 时设置它。这要求您先创建一个 Config,然后创建一个 ScriptDirectory,然后再创建一个 EnvironmentContext。那么在运行修改的时候需要正确使用这些对象自己搭建环境

简短的回答是,有两个扩展(据我所知)可以为您将 Flask-SQLAlchemy 与 Alembic 集成。 Flask-Migrate 已经存在了一段时间,并提供了几乎直接包装 Alembic 基本命令的包装。

Flask-Alembic(由我编写)(与未开发的同名旧项目无关)提供与 Flask 和 Alembic 的更紧密集成。它公开了 Alembic 的内部结构并与 Flask 开发版本一起工作,但更新且更具实验性。

它们都得到积极维护。如果您需要了解内部结构,请选择 Flask-Alembic。如果您只需要命令,请选择 Flask-Migrate。