我正在尝试读取先前作为BLOB存储在Oracle DB中的protocolbuffer消息。 我正在使用python + google协议缓冲区来读取数据:
oracle 11g
python 2.6.7
谷歌协议缓冲区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())
有什么想法吗? 欢呼声。
答案 0 :(得分:0)
没有指定使用哪个模块访问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()方法通常在序列化时使用,以计算序列化消息的大小。我不确定它是否可以在解析消息后使用。在协议缓冲区API中,ByteSize()显然与序列化相关联。在解析时调用它实际上是没有意义的,因为在解析之前已知缓冲区的大小。