无法从MySQL获取数据:Discord Bot代码fetch返回None问题排查
问题分析与解决
1. 缺少json模块导入
代码中使用了json.dumps但未导入json模块,会触发NameError导致函数异常退出,无法正常返回结果。需要在代码开头添加:
import json
2. save函数的UPDATE逻辑缺陷
如果目标表test中不存在id=1的记录,UPDATE语句不会自动创建新记录,导致fetch时找不到对应数据。建议改用REPLACE INTO语句,确保无论记录是否存在都能写入数据:
# 替换save函数中的UPDATE语句 cursor.execute(f"REPLACE INTO {table} (id, json_data) VALUES (1, %s)", (json_data,))
3. JSON数据处理错误
json.dumps(str(data))会先把字典转成字符串(比如{"a":"b"}变成"{'a': 'b'}")再序列化,导致存储的数据是字符串的JSON而非原始字典的JSON。正确写法是直接序列化字典:
json_data = json.dumps(data)
4. 未定义check_table函数
save函数中调用了check_table(table)但未实现该函数,会触发NameError导致保存操作失败,数据根本没写入数据库。要么实现该函数(比如检查表是否存在,不存在则创建),要么直接删除这个调用(如果表已提前创建)。
5. finally块的异常风险
如果数据库连接失败(比如conn未创建成功),finally块中调用cursor.close()或conn.close()会触发AttributeError,导致函数无法正常返回值。可以修改finally块,先判断对象是否存在:
finally: if 'cursor' in locals() and cursor is not None: cursor.close() if 'conn' in locals() and conn is not None: conn.close()
为什么输出None?
如果save过程中因为上述错误(比如check_table未定义)触发异常,数据根本没写入数据库,fetch时result为None,原本应该返回{},但如果函数因为未捕获的异常(比如缺少json模块)提前退出,就会返回None。
内容的提问来源于stack exchange,提问作者tudubucket
相关产品推荐
相关产品推荐

