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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:15:03