FastAPI结合SQLite插入数据时报参数类型不支持错误如何解决
问题原因
错误来自你给cursor.execute()传入了InArticle类型的Pydantic模型实例作为参数,数据库游标无法识别该类型,仅支持元组、列表、字典等原生Python数据结构作为查询参数。
代码中存在的其他问题
- 重复实例化
InArticle完全多余:接口参数article本身已经是符合要求的InArticle实例,不需要再手动赋值创建一次article_obj - 未提交事务:多数数据库连接默认关闭自动提交,执行INSERT语句后如果不调用
connexion.commit(),数据不会真正写入数据库 - 直接关闭全局连接:执行完单次请求就关闭数据库连接会导致后续请求无法复用连接,出现连接失效报错,应该仅关闭当前使用的游标,或者用上下文管理器自动管理连接/游标生命周期
修复方案
两种传参方式选一种即可:
方式1:按位置传参(适配现有?占位符写法)
直接提取模型字段值组成元组传入execute:
@app.post("/articles", response_model=InArticle) async def create_article(article: InArticle): cursor = connexion.cursor() db_query = """INSERT INTO Article (title, slug, content, author) VALUES (?, ?, ?, ?)""" # 按占位符顺序传参,用元组封装字段值 cursor.execute(db_query, (article.title, article.slug, article.content, article.author)) # 提交事务 connexion.commit() # 仅关闭游标,不要关闭全局连接 cursor.close() return article
方式2:按字段名传参(更稳妥,不需要关心参数顺序)
修改SQL为命名占位符,直接传入模型转换后的字典:
@app.post("/articles", response_model=InArticle) async def create_article(article: InArticle): cursor = connexion.cursor() # 用命名占位符匹配模型字段名,不同数据库命名占位符格式可能略有差异,常见为:字段名、%(字段名)s db_query = """INSERT INTO Article (title, slug, content, author) VALUES (:title, :slug, :content, :author)""" # Pydantic v2版本用model_dump()转字典,v1版本替换为dict() cursor.execute(db_query, article.model_dump()) connexion.commit() cursor.close() return article
内容的提问来源于stack exchange,提问作者GroovyHooked
相关产品推荐
相关产品推荐

