FastAPI + PyMySQL 报错:“dict can not be used as parameter”的原因及解决方案

❌ FastAPI + PyMySQL 报错 “dict can not be used as parameter” 问题及解决方案
最近在开发一个基于 FastAPI 的碳足迹因子智能匹配系统时,后端保存接口数据到 MySQL 时遇到了如下错误:

❌ 解析失败: dict can not be used as parameter
一、问题背景复现
原始代码如下:

save_qa_record(
tenant_id=None,
user_id=None,
em_id=chat_param.emId,
em_name=chat_param.emName,
question=deepseek_param,
answer=result_list, # 🚨 错误点:是 list 类型
json_answer=response, # 是 dict 类型
type=1
)
打印数据类型:

print(f"🧪 类型检查:{type(result_list)}")

输出:<class ‘list’>

这是典型的 试图将 Python 的 list/dict 直接写入 MySQL 的错误用法。

二、错误原因分析
MySQL 的字段类型本质只支持基本数据类型(如 VARCHAR、TEXT、INT 等),而 list 或 dict 是 Python 内部的数据结构,PyMySQL 并不会自动将其转换成字符串。

因此出现:

TypeError: dict can not be used as parameter
三、解决方案 ✅ 使用 json.dumps 序列化
我们需要 先把 list/dict 序列化成 JSON 字符串:

import json

save_qa_record(
tenant_id=None,
user_id=None,
em_id=chat_param.emId,
em_name=chat_param.emName,
question=deepseek_param,
answer=json.dumps(result_list, ensure_ascii=False), # ✅ 处理 list
json_answer=json.dumps(response, ensure_ascii=False), # ✅ 处理 dict
type=1
)
这样就可以成功插入数据库了。

四、类型存储处理推荐表
数据类型 是否可直接插入数据库 推荐处理方式
str ✅ 是 无需处理
int/float ✅ 是 无需处理
list ❌ 否 json.dumps(list_obj)
dict ❌ 否 json.dumps(dict_obj)

五、通用封装建议(推荐)
建议统一封装一个类型转换函数,增强健壮性和可读性:

def to_json_str(obj):
if isinstance(obj, (dict, list)):
return json.dumps(obj, ensure_ascii=False)
return obj
使用示例:
save_qa_record(
answer=to_json_str(result_list),
json_answer=to_json_str(response),

)
六、总结
❌ 不能将 list/dict 直接写入数据库;

✅ 必须用 json.dumps() 序列化为字符串;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值