You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQLModel模型类在已有FastAPI数据库中创建新表?

解决方案:通过SQLModel模型类创建新表

问题根源分析

你的代码存在三个关键问题:

  1. 模型定义缺失依赖:使用Field但未从sqlmodel导入,导致字段初始化异常。
  2. 主键未正确配置:原生SQL中key是主键,但模型未设置primary_key=True,不符合表结构要求。
  3. create_all传参错误:指定tables参数时传入了模型类,而非表对象(模型的__table__属性),触发类型校验错误。

修复步骤

1. 修正Table2模型定义

在models/table2.py中补全导入并修正字段配置:

from sqlmodel import SQLModel, Field  # 新增Field导入

class Table2(SQLModel, table=True):
    key: str = Field(
        default=None, 
        foreign_key="table1.id",
        primary_key=True  # 匹配原生SQL的主键设置
    )
    execution_id: str = Field(title="My Execution ID", index=False, default=None)

2. 确保模型被导入

在调用create_all之前,必须导入Table2(及依赖的Table1),否则SQLModel的元数据不会包含这些表的信息。

3. 正确调用create_all

有两种可行方式:

方式一:自动识别所有已导入的模型

def create_specific_table():
    from db.engine import engine  # 确保导入引擎
    from models.table2 import Table2  # 必须导入Table2模型
    from models.table1 import Table1  # 如果Table1未被其他地方导入,也需要导入
    
    SQLModel.metadata.create_all(engine)

方式二:指定具体表对象

如果你只想创建特定表,传入模型的__table__属性:

def create_specific_table():
    from db.engine import engine
    from models.table2 import Table2
    from models.table1 import Table1
    
    SQLModel.metadata.create_all(engine, tables=[Table1.__table__, Table2.__table__])

验证启动逻辑

保持main.py中的启动事件不变,确保create_specific_table函数能正确执行:

@app.on_event("startup")
def on_startup():
    create_db_and_tables() # 创建Team和Hero表
    create_specific_table() # 创建Table2表

内容的提问来源于stack exchange,提问作者sharingiscaring

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:41:04