由于某种原因,在向模型添加新列后,alembic 的命令
alembic revision --autogenerate
会检测到一个新表,并相应地为整个实体生成新的迁移,而不是仅选取新列。
模型的基类在 env.py 配置文件中被提及为
target_metadata = MyBase.metadata
,因此它会选择新模型。但是,当您添加新列时,它不会生成仅添加新列的修订版,而是重新生成整个模型。
在运行
alembic revision --autogenerate
之前,新的更改将通过 alembic upgrade head
迁移到数据库。
我的基类有一个标准的 declarative_base,并且我的模型扩展了它。
还有其他可能出错的地方吗?可能我错过了一些明显的东西;(
这很可能是因为您没有在默认模式下工作。
默认的 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