【问题标题】:Creating "zero state" migration for existing db with sqlalchemy/alembic and "faking" zero migration for that existing db使用 sqlalchemy/alembic 为现有数据库创建“零状态”迁移,并为该现有数据库“伪造”零迁移
【发布时间】:2019-02-06 20:22:27
【问题描述】:

我想将 alembic 添加到现有的 sqlalchemy 项目中,并带有一个工作生产数据库。我找不到执行“零”迁移的标准方法 == 像现在一样设置数据库的迁移(对于设置环境的新开发人员)

目前我已将声明性基类和所有使用它的模型添加到 env.py 中,但第一次 alembic -c alembic.dev.ini revision --autogenerate 确实创建了现有表。

而且我需要在现有安装上“伪造”迁移 - 使用代码。对于 django ORM,我知道如何完成这项工作,但我找不到使用 sqlalchemy/alembic 的正确方法

【问题讨论】:

    标签: python sqlalchemy alembic


    【解决方案1】:

    全新安装:应用迁移

    只需对空数据库运行alembic upgrade head。这会将所有迁移(在您的情况下是初始迁移,因为它是唯一的迁移)应用到数据库。

    如果您想通过代码而不是 shell 执行此操作,可以通过以下方式进行:

    from alembic.config import Config
    from alembic import command
    alembic_cfg = Config("/path/to/yourapp/alembic.ini")
    command.upgrade(alembic_cfg, "head")
    

    现有安装:伪造迁移

    SQL方式

    一种方法是针对数据库运行此 SQL:

    CREATE TABLE IF NOT EXISTS alembic_version (
        version_num VARCHAR(32) NOT NULL
    );
    
    INSERT INTO alembic_version (version_num) VALUES ('your initial migration version');
    

    第一条语句创建 alembic 用来跟踪数据库/迁移状态的表。第二条语句基本上告诉 alembic,您的数据库状态对应于初始迁移的版本,或者换句话说,伪造了迁移。

    蒸馏方式

    Alembic 有一个stamp 命令,它基本上做同样的事情。它可以从 shell 调用为alembic stamp head,也可以从代码中调用(取自cookbook):

    from alembic.config import Config
    from alembic import command
    alembic_cfg = Config("/path/to/yourapp/alembic.ini")
    command.stamp(alembic_cfg, "head")
    

    【讨论】:

    • 谢谢米哈伊尔,这个答案的问题:1.它没有回答“如何为新开发人员创建零状态数据库”2.它是直接的 SQL 与数据库,虽然这可能是最简单的,我更喜欢这个问题的代码驱动解决方案
    • @alonisser 我已经扩展了答案,希望这能解决您的问题。
    【解决方案2】:

    alembic revision --autogenerate 检查连接数据库的状态和目标metadata 的状态,然后创建一个迁移,使databasemetadata 保持一致。

    如果您将alembic/sqlalchemy 引入现有数据库,并且您想要一个迁移文件,该文件给定一个空的、新的数据库来重现当前状态 - 请按照以下步骤操作。

    1. 确保您的 metadata 与您当前的 database 真正一致(即确保运行 alembic revision --autogenerate 会创建一个零操作的迁移)。

    2. 创建一个空的新temp_db,并将alembic.ini 中的sqlalchemy.url 指向这个新temp_db.

    3. 运行alembic revision --autogenerate。这将创建您所需的批量迁移,从而使新数据库与当前数据库保持一致。

    4. 删除temp_db 并将sqlalchemy.url 重新指向您现有的数据库。

    5. 运行alembic stamp head。这告诉 sqlalchemy 当前迁移代表数据库的状态——所以下次你运行 alembic upgrade head 时,它将从这个迁移开始。

    【讨论】:

    • 这对我来说不是很明显,所以这对其他人也可能有用:确保在运行步骤 3) 之前删除在步骤 1) 期间在 alembic 的版本目录中生成的空修订文件) 否则,您将收到“数据库不是最新的”错误。
    猜你喜欢
    • 2015-03-04
    • 2016-05-21
    • 2014-05-03
    • 2017-11-22
    • 2013-07-31
    • 1970-01-01
    • 2012-04-27
    • 2017-05-02
    • 2014-06-24
    相关资源
    最近更新 更多