Python使用sqlite3存储列表、自定义对象等可迭代类型的方案咨询
核心结论
你遇到的「反斜杠无法存入BLOB字段」不是BLOB类型本身的问题,本质是你手动拼接SQL语句时,Python字节字面量里的转义符被SQL引擎错误解析导致的,不需要特意删除反斜杠,根据使用场景选以下方案即可:
方案1:优先使用BLOB字段存储pickle序列化字节(Python生态内使用最优)
SQLite的BLOB字段原生支持直接存储任意bytes类型数据,你只需要改用参数化查询传入pickle生成的字节对象,不需要做任何额外转义处理,示例代码如下:
import sqlite3 import pickle my_list = ['a', 'b', 'c'] # 正常序列化得到字节对象 serialized_data = pickle.dumps(my_list) # 连接数据库 conn = sqlite3.connect('data.db') cursor = conn.cursor() # 建表指定content字段为BLOB类型 cursor.execute('CREATE TABLE IF NOT EXISTS storage (id INTEGER PRIMARY KEY AUTOINCREMENT, content BLOB)') # 用参数化查询传入字节对象,完全不会有转义问题 cursor.execute('INSERT INTO storage (content) VALUES (?)', (serialized_data,)) conn.commit() # 读取验证 cursor.execute('SELECT content FROM storage ORDER BY id DESC LIMIT 1') fetched_data = cursor.fetchone()[0] loaded_list = pickle.loads(fetched_data) print(loaded_list) # 输出:['a', 'b', 'c'] conn.close()
该方案优势:无额外编解码开销、存储体积小、序列化反序列化效率高,适合仅在Python项目中使用的场景。
方案2:需跨语言使用/强制要求存字符串字段时,转Base64编码
如果你的场景需要存TEXT类型字段、或者需要跨编程语言读取,可以把pickle生成的字节转成Base64编码的纯ASCII字符串,完全没有特殊转义字符,示例代码如下:
import pickle import base64 my_list = ['a', 'b', 'c'] serialized_data = pickle.dumps(my_list) # 转Base64字符串 base64_str = base64.b64encode(serialized_data).decode('ascii') # 直接将base64_str存入TEXT类型字段即可 # 读取时反向操作: restored_bytes = base64.b64decode(base64_str) loaded_list = pickle.loads(restored_bytes)
该方案注意点:Base64编码会让存储体积增加约1/3,且多了一层编解码开销,优势是字符串格式通用,无转义风险。
补充:纯字符串列表的更优选择
如果你要存储的只有纯字符串列表,不需要存自定义Python对象,完全不需要用pickle,直接转成JSON字符串存TEXT字段即可,跨语言友好、可读性更高:
import json import sqlite3 my_list = ['a', 'b', 'c'] json_str = json.dumps(my_list) # 存TEXT字段,读取时直接json.loads()即可还原
内容的提问来源于stack exchange,提问作者JrCaspian
相关产品推荐
相关产品推荐

