使用sqlalchemy / alembic为现有数据库创建“零状态”迁移,为该现有数据库创建“伪造”零迁移

时间:2018-08-31 19:23:28

标签: python sqlalchemy alembic

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

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

我需要使用代码“伪造”现有安装上的迁移。对于django ORM,我知道如何做到这一点,但是我找不到使用sqlalchemy / alembic

的正确方法

2 个答案:

答案 0 :(得分:2)

新安装:应用迁移

只需对空数据库运行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方式

Alembic有一个stamp命令,基本上可以完成相同的操作。可以从外壳将其称为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 :(得分:1)

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

如果要将alembic/sqlalchemy引入到现有数据库中,并且想要一个迁移文件,该文件给出一个空的,新鲜的数据库将重现当前状态,请执行以下步骤。

1)确保您的metadata与您当前的database完全一致。运行alembic revision --autogenerate会创建零操作的迁移。

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

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

4)删除temp_db,然后将sqlalchemy.url指向您现有的数据库。

5)运行alembic stamp head。这告诉sqlalchemy当前的迁移代表数据库的状态-因此,下次您运行alembic upgrade head时,它将从此迁移开始。