Python SQLite3:从Blob取回Buffer后还原为Bencoded字节对象
解决方法:从SQLite Blob的Buffer对象还原原始Bencoded数据
嘿,这个问题其实很好解决——当你从SQLite的Blob字段取回Buffer对象时,只需要简单几步就能还原成原始的字节数据或者sqlite3.Binary类型,我给你拆解一下:
核心逻辑
sqlite3.Binary本质上只是字节数据的一个包装类,用来告诉SQLite把这个序列当作Blob存储。当你查询取回时得到的Buffer对象,其实和原始字节数据是完全兼容的,只需要做个简单转换就能恢复。
1. 直接还原为原始Bencoded字节对象
如果你的目标是拿到存入时的原始字节数据(也就是libtorrent的bencode()返回的结果),直接用bytes()函数把Buffer对象转成字节即可:
# 假设你从查询结果中拿到了buffer_data raw_bencoded_bytes = bytes(buffer_data)
这个raw_bencoded_bytes就是和你存入前完全一致的Bencoded字节序列,可以直接传给libtorrent.torrent_info()重新解析种子信息。
2. 还原为sqlite3.Binary类型
如果你需要严格还原成存入时的sqlite3.Binary对象,只需要把转换后的字节传入sqlite3.Binary()构造函数:
import sqlite3 # 先转成字节 raw_bytes = bytes(buffer_data) # 再包装成sqlite3.Binary binary_obj = sqlite3.Binary(raw_bytes)
这样得到的binary_obj就和你存入数据库时的对象完全一样了。
完整示例代码
这里给你一个从存到取的完整流程参考,方便你对照:
import sqlite3 import libtorrent as lt # ---------------------- # 存入数据的代码 # ---------------------- # 获取种子的Bencoded数据 torrent_info = lt.torrent_info("your_torrent.torrent") bencoded_data = torrent_info.bencode() # 连接数据库并存入 conn = sqlite3.connect("torrents.db") cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS torrents (id INTEGER PRIMARY KEY, torrent_data BLOB)") # 用sqlite3.Binary包装后存入 cursor.execute("INSERT INTO torrents (torrent_data) VALUES (?)", (sqlite3.Binary(bencoded_data),)) conn.commit() conn.close() # ---------------------- # 查询并还原的代码 # ---------------------- conn = sqlite3.connect("torrents.db") cursor = conn.cursor() cursor.execute("SELECT torrent_data FROM torrents WHERE id = ?", (1,)) result = cursor.fetchone() if result: # 取回的Buffer对象 buffer_data = result[0] # 还原为原始字节 raw_bencoded = bytes(buffer_data) # 重新解析为torrent info restored_torrent = lt.torrent_info(raw_bencoded) print(f"还原成功,种子名称:{restored_torrent.name()}") conn.close()
补充说明
有些情况下,你取回的可能是memoryview对象(也会被当作Buffer类处理),不用担心,同样用bytes()转换就可以,效果完全一样,不会丢失任何数据。
内容的提问来源于stack exchange,提问作者Henk
相关产品推荐
相关产品推荐

