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

alo*_*ser 15 python sqlalchemy alembic

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

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

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

mic*_*ard 24

alembic revision --autogenerate检查连接的数据库和所述目标的状态的状态metadata,然后创建带来的迁移database符合metadata

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

1) 确保您metadata真正符合您当前的database. 运行alembic revision --autogenerate会创建零操作的迁移。

2)创建一个新的temp_db即是空的,你的观点sqlalchemy.urlalembic.ini这个新temp_db.

3)运行alembic revision --autogenerate。这将创建您想要的批量迁移,带来与当前数据库一致的新数据库。

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

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

  • 这对我来说不是那么明显,所以这对其他人也可能有用:请务必在运行步骤 3) 之前删除步骤 1) 期间在 alembic 版本目录中生成的空修订文件,否则,您将得到“数据库不是是最新的”错误。 (3认同)

Mik*_*eyn 9

新安装:应用迁移

只需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")
Run Code Online (Sandbox Code Playgroud)

现有安装:伪造迁移

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');
Run Code Online (Sandbox Code Playgroud)

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

蒸馏方式

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

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