gpt4 book ai didi

python - Alembic revision --autogenerate 始终检测新表,而不是检测新列

转载 作者:行者123 更新时间:2023-12-05 02:40:08 25 4
gpt4 key购买 nike

出于某种原因,在向模型添加新列后,alembic 的命令 alembic revision --autogenerate 检测到一个新表,并相应地为整个实体生成一个新的迁移,而不是选择仅增加新列。

模型的基类在 env.py 配置文件中提到为 target_metadata = MyBase.metadata,因此它正在选择新模型。但是,当您添加新列时,它不会生成仅添加了新列的修订版,而是会重新生成整个模型。

在运行 alembic revision --autogenerate 之前,使用 alembic upgrade head 将新更改迁移到 db。

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

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

最佳答案

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

要解决这个问题,您应该根据 Alembic 文档的这一章修改 env.py 文件: Omitting Schema Names from the Autogenerate Process

这包括修改 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

关于python - Alembic revision --autogenerate 始终检测新表,而不是检测新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68731599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com