Alembic 修订版 --autogenerate 始终检测新表,而不是检测新列

问题描述 投票:0回答:1

由于某种原因,在向模型添加新列后,alembic 的命令

alembic revision --autogenerate
会检测到一个新表,并相应地为整个实体生成新的迁移,而不是仅选取新列。

模型的基类在 env.py 配置文件中被提及为

target_metadata = MyBase.metadata
,因此它会选择新模型。但是,当您添加新列时,它不会生成仅添加新列的修订版,而是重新生成整个模型。

在运行

alembic revision --autogenerate
之前,新的更改将通过
alembic upgrade head
迁移到数据库。

我的基类有一个标准的 declarative_base,并且我的模型扩展了它。

还有其他可能出错的地方吗?可能我错过了一些明显的东西;(

python alembic
1个回答
8
投票

这很可能是因为您没有在默认模式下工作。
默认的 Alembic 行为是扫描默认模式并查找其中的更改。如果您将数据库迁移到不同的模式,Alembic 将始终检查 target_metadata 和默认模式之间的差异,从而每次生成相同的迁移脚本。

要解决此问题,您应该根据 Alembic 文档的本章修改

env.py
文件: 从自动生成过程中省略架构名称

这包括修改

context.configure()
部分以接受两个附加参数:

context.configure(
    url=url,
    target_metadata=target_metadata,
    literal_binds=True,
    dialect_opts={"paramstyle": "named"},
    include_schemas=True,
    include_name=include_name,
)

include_schemas
负责允许 Alembic 查找您连接到的数据库中所有模式的更改。

include_name
是一个功能,您可以在其中列出要扫描更改的模式。该函数如下所示:

def include_name(name, type_, parent_names):
    if type_ == "schema":
        return name in [list_of_schemas_to_be_scanned]
    else:
        return True
© www.soinside.com 2019 - 2024. All rights reserved.