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客户端打开后执行两个命令:
高频踩坑:SQLite连接如果写的是相对路径,很容易因为服务启动工作目录不对,自动新建一个空的数据库文件,你以为连的是存了数据的旧库,实际连的是刚生成的空库,自然找不到对应字段和表。.tables -- 查看库中所有现存表 .schema 表名 -- 替换成上一步查到的业务表名,确认实际存在的字段 - 第二步:核对模型表名配置
打开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
相关产品推荐
相关产品推荐

