如何在 FastAPI 中更改基于模型的列的名称?

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

在 FastAPI 中,数据库是自动生成的,它是根据我当时拥有的模型创建的。创建数据库后,我将模型的属性名称从“owner_id”更改为“user_id”,但在重新运行 API 后,它没有升级数据库。

如何在 FastAPI 中触发数据库升级(使用 SQLAlchemy)?我需要运行特定的命令吗?

我已经尝试为此生成迁移并且它可以工作,但我认为有一种更简单的方法不依赖于从 Alembic 迁移。

我希望 CLI 命令在模型更改后触发数据库升级...

python sqlalchemy fastapi alembic
1个回答
0
投票

自动升级数据库是一个非常糟糕的主意。 在很多情况下,不清楚发生了什么/如何发生变化。您将列

owner_id
重命名为
user_id
的示例就是一个典型示例。有多种更改数据库以匹配新模式的方法:

  1. owner_id
    列重命名为
    user_id
  2. 或删除旧的
    owner_id
    列并创建一个新的空
    user_id

事实上,一些工具会更喜欢第二个版本(包括 Alembic:Autogenerate Detect 是什么(以及它没有检测到什么?)),并且您会丢失该列的全部数据。 更改数据库架构的最佳方法是通过手动迁移检查进行数据库迁移。 Alembic 是它的典型工具。一开始初始化它,每当有变化时:

  1. alembic revision --autogenerate -m "some message"
  2. 手动检查生成的修订版是否有错误/完整性,如果有错误/缺失则修复/扩展它
  3. alembic upgrade head

警告:这里很危险.

如果您真的想直接应用更改,您也可以以编程方式使用 Alembic:通过请求更改并直接应用它们。 Alembic 文档有这样一个用例的配方:直接运行 Alembic 操作对象(如来自自动生成)。 但正如我上面提到的,你很可能会使用这种方法丢失一些数据,可能迟早会丢失。


顺便说一句,FastAPI 不会为您生成表格。在你的代码中的某个地方,你可能有像

Base.metadata.create_all(engine)
这样的东西,它是纯 SqlAlchemy 代码。

© www.soinside.com 2019 - 2024. All rights reserved.