我正在尝试读取以前作为 BLOB 存储在 Oracle 数据库中的 Protocol Buffer 消息。 我正在使用 python + python 的 google Protocol Buffer 来读取数据:
甲骨文 11g
python 2.6.7
谷歌 Protocol Buffer 2.4.1
消息解析正常:它不会返回任何异常。
但是读取的消息大小始终为 0(将行显示为文本表明它不为空)
cursor.execute("select myblob from mytable")
mydata = Data_pb2.MyData()
for dataDB in cursor:
mydata.ParseFromString(dataDB[0])
print "size:" + str(mydata.ByteSize())
有什么想法吗? 干杯。
最佳答案
没有指定是用哪个模块访问Oracle,所以我假设是cx_Oracle。
当从 Oracle 读取 LOB 时,OCI 提供了一个 LOB 定位器,它被 cx_Oracle 包装到一个对象中。所以在示例中,dataDB[0] 不是字符串而是 cx_Oracle.LOB 对象。根据 ParseFromString 的编码方式,它可能会也可能不会正确转换为字符串。
所以我会使用 dataDB[0].read() 作为 ParseFromString 的参数。
cursor.execute("select myblob from mytable")
for dataDB in cursor:
lob = dataDB[0].read()
print "size:", len(lob)
mydata = Data_pb2.MyData()
mydata.ParseFromString(lob)
此外,ByteSize() 方法通常在序列化时用于计算序列化消息的大小。我不确定它是否可以在解析消息后立即使用。在 Protocol Buffer API 中,ByteSize() 显然与序列化相关联。在解析时调用它实际上是没有意义的,因为缓冲区的大小在解析之前就已经知道了。
关于python - 存储为 Oracle BLOB : python retrieve fails 的 Protocol Buffer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650820/