多文件关系中的 FastAPI 模型

FastAPI Models in multiple files relationship

我是 fastapi 的新手,我正在设置一些模型以在单独的文件中与 sqlalchemy 一起使用,但由于某种原因,两个 table 之间的一对多关系不起作用,并且根本没有创建任务 table 中的 client_id 列。下面是模型的代码以及 main.py 文件,我们将不胜感激,所以我正在努力弄清楚为什么它不起作用,因为大多数在线示例都将它们的模型放在一个文件中。

任务模型:

from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from sqlalchemy.orm import relationship

from database import Base

class TaskModel(Base):
    __tablename__ = "tasks"

    id = Column(Integer, primary_key=True, index=True)
    script_log = Column(String, index=True)
    start_timestamp = Column(DateTime, index=True)
    finish_timestamp = Column(DateTime, index=True)

    client_id = Column(Integer, ForeignKey("clients.id"))
    client = relationship(
        "ClientModel", foreign_keys=[client_id], 
         back_populates="tasks"
    )

客户端模型:

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship

from database import Base

class ClientModel(Base):
    __tablename__ = "clients"

    id = Column(Integer, primary_key=True, index=True)
    client_name = Column(String, index=True)

    tasks = relationship(
        "TaskModel", foreign_keys="[TaskModel.client_id]", back_populates="client"
    )

main.py

from pydoc import cli
from fastapi import FastAPI

from routers import clients, processes, statuses

from database import SessionLocal, engine

from models import task, client


client.Base.metadata.create_all(bind=engine)
task.Base.metadata.create_all(bind=engine)

app = FastAPI()

app.include_router(clients.router)
app.include_router(processes.router)
app.include_router(statuses.router)

启动 uvicorn 时我没有收到任何错误,并且所有其他列都在 postgres 中正常显示,除了 client_id 列

更改模型后,您必须删除现有的 table,否则 create_all 语句将不会执行任何操作(即如果 table 存在,它'我会留下它 - 它不会更新它)。

要获得迁移支持(这会将现有结构更改为新格式),请使用 Alembic - a project to generate migration scripts from different SQLAlchemy model versions。将这些文件像任何其他文件一样添加到您的版本控制中,您也将能够在多个位置处理同一数据库的多个版本。 运行 迁移以确保数据库与您的代码保持同步。