如何通过SQLModel模型类在已有FastAPI数据库中创建新表?
解决方案:通过SQLModel模型类创建新表
问题根源分析
你的代码存在三个关键问题:
- 模型定义缺失依赖:使用
Field但未从sqlmodel导入,导致字段初始化异常。 - 主键未正确配置:原生SQL中
key是主键,但模型未设置primary_key=True,不符合表结构要求。 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
相关产品推荐
相关产品推荐

