2012-03-10 71 views
4

我正在尝试读取以前作为BLOB存储在Oracle数据库中的协议缓冲区消息。 我使用蟒+谷歌协议缓冲区为蟒来读取数据:作为Oracle BLOB存储的协议缓冲区:python检索失败

的Oracle 11g
蟒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

没有指定使用哪个模块访问Oracle,所以我认为它是cx_Oracle。

当从Oracle读取LOB时,OCI提供了一个由cx_Oracle包装到对象中的LOB定位器。所以在这个例子中,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()显然与序列化相关联。实际上,在解析时调用它是毫无意义的,因为缓冲区的大小在解析之前是已知的。

+0

其实我已经尝试过LOB读取方法,但结果相同。该尺寸仅用于调试目的,因为我无法正常工作。与您的代码,我确认LOB的大小不为空,但解析它仍然失败:( – user1261609 2012-03-11 18:28:57