存储为Oracle BLOB的协议缓冲区:python检索失败

时间:2012-03-10 22:40:40

标签: python oracle blob protocol-buffers

我正在尝试读取先前作为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())

有什么想法吗? 欢呼声。

1 个答案:

答案 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()显然与序列化相关联。在解析时调用它实际上是没有意义的,因为在解析之前已知缓冲区的大小。