2012-03-10 68 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