我想使用一个有生产数据库的项目在现有的sqlalchemy中添加alembic。我找不到执行“零”迁移的标准方法==迁移现在就设置数据库(对于新开发人员设置其环境)
当前,我已将声明性基类和使用该基类的所有模型添加到env.py中,但是第一次alembic -c alembic.dev.ini revision --autogenerate
确实创建了现有表。
我需要使用代码“伪造”现有安装上的迁移。对于django ORM,我知道如何做到这一点,但是我找不到使用sqlalchemy / alembic
的正确方法答案 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的方法:
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
命令,基本上可以完成相同的操作。可以从外壳将其称为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
的状态,然后创建使database
与metadata
保持一致的迁移。
如果要将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
时,它将从此迁移开始。