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() 序列化为字符串;