【问题标题】:How to initialize Alembic on an existing DB如何在现有数据库上初始化 Alembic
【发布时间】:2021-11-27 21:31:04
【问题描述】:

我有一个使用 SQLAlchemy 进行数据库访问的现有应用程序。效果很好。

现在我想介绍数据库迁移,我读到 alembic 是推荐的方式。基本上我想从“当前数据库状态”(不是空数据库!)作为修订 0 开始,然后跟踪进一步的修订。

所以我安装了alembic(1.7.3版)并放了

from my_project.db_tables import Base
target_metadata = Base.metadata

进入我的env.pyBase 只是我项目中的标准 SQLAlchemy Base = sqlalchemy.ext.declarative.declarative_base()(同样,它工作正常)。

然后我运行alembic revision --autogenerate -m "revision0",期望看到一个upgrade() 方法,它可以让我从一个空数据库进入当前数据库状态。或者可能是一个空的upgrade(),因为这是第一次修订,我不知道。

相反,upgrade() 方法充满了op.drop_indexop.drop_table 调用,而downgrade() 则全部是op.create_indexop.create_table。基本上和我的预期相反。

知道有什么问题吗? 从现有数据库状态“初始化”迁移的推荐方法是什么?

【问题讨论】:

  • @GordThompson 谢谢。第一个链接不相关(我不使用大写)。第二个链接可能是——显然,即使第一步也失败了:alembic revision --autogenerate 创建了一个巨大的文件,如 OP 中所述。但仍然不确定该怎么做。

标签: python-3.x sqlalchemy alembic


【解决方案1】:

好的,我想通了。

现有的生产数据库有很多 alembic revision --autogenerate 没有注意到的东西。这就是为什么它生成的迁移脚本在upgrade() 中充满了op.drops,在downgrade() 中充满了op.creates。

所以我每次都必须手动清理生成的脚本。或者在 Alembic 之外以某种方式以编程方式自动执行此清理 Python 脚本清理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2020-01-12
    相关资源
    最近更新 更多