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

FastAPI+SQLAlchemy操作SQLite报no such column: items.name错误

问题根因

这个(sqlite3.OperationalError) no such column: items.name报错本质是代码执行的SQL语句,和SQLite中实际存在的表结构不匹配,结合你给出的信息,核心矛盾点在于:你提到model.py中定义的是User_History表,但实际执行的SQL却在查询名为items的表下的字段,优先从以下方向排查:

排查&修复步骤
  • 第一步:核对数据库连接与实际表结构
    找到项目中SQLAlchemy配置的SQLite文件路径,用sqlite客户端打开后执行两个命令:
    .tables -- 查看库中所有现存表
    .schema 表名 -- 替换成上一步查到的业务表名,确认实际存在的字段
    
    高频踩坑:SQLite连接如果写的是相对路径,很容易因为服务启动工作目录不对,自动新建一个空的数据库文件,你以为连的是存了数据的旧库,实际连的是刚生成的空库,自然找不到对应字段和表。
  • 第二步:核对模型表名配置
    打开model.py查看User_History类的__tablename__属性配置:
    • 如果配置为__tablename__ = "items",说明之前建表时用的表结构和当前模型不一致,你改了模型字段后没有同步更新表结构,导致现存的items表缺少name等字段
    • 如果配置为其他值(比如SQLAlchemy默认生成的user_history),说明查询代码写错了:要么是联表时给表起了items的别名但没正确关联,要么是查询语句里硬编码写了items.name,和实际表名/模型名不匹配
  • 第三步:同步表结构
    开发环境无存量数据的话,直接删除旧的.db数据库文件,重启FastAPI服务,确认SQLAlchemy的create_all()方法在所有模型导入完成后调用,会自动按最新模型结构建表,问题直接解决。
    有存量数据不能删库的话,手动执行ALTER语句给对应表加缺失字段即可:
    -- 把your_table_name替换成你实际查到的业务表名
    ALTER TABLE your_table_name ADD COLUMN name VARCHAR(64);
    ALTER TABLE your_table_name ADD COLUMN age INTEGER;
    ALTER TABLE your_table_name ADD COLUMN sex VARCHAR(8);
    ALTER TABLE your_table_name ADD COLUMN weight FLOAT;
    
注意避坑

SQLAlchemy的create_all()方法不会自动修改已经存在的表结构,只要对应表已经在库里存在,哪怕你改了模型字段、加了新列,重启服务也不会同步更新表结构,必须手动做迁移或者删表重建,这是90%同类报错的诱因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:09:22