【问题标题】:How can I programmatically set the 'target_metadata' required by Alembic for use with the command API?如何以编程方式设置 Alembic 所需的“target_metadata”以与命令 API 一起使用?
【发布时间】:2015-03-10 19:00:01
【问题描述】:

我正在使用Alembic 管理数据库迁移,并希望使用alembic init 生成的默认文件,而无需对env.py(例如setting target_metadata)或alembic.ini(例如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?

【问题讨论】:

    标签: python sqlalchemy database-migration flask-sqlalchemy alembic


    【解决方案1】:

    长答案是您没有在那里设置元数据,而是在创建MigrationContext 时设置它。这要求您先创建一个Config,然后是一个ScriptDirectory,然后是一个EnvironmentContext。然后你需要在运行修订时正确使用这些对象来自己设置环境。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 2010-12-16
      • 2017-06-07
      • 2014-06-11
      • 2019-07-13
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多