多文件关系中的 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。将这些文件像任何其他文件一样添加到您的版本控制中,您也将能够在多个位置处理同一数据库的多个版本。 运行 迁移以确保数据库与您的代码保持同步。
我是 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。将这些文件像任何其他文件一样添加到您的版本控制中,您也将能够在多个位置处理同一数据库的多个版本。 运行 迁移以确保数据库与您的代码保持同步。