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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:36:01