2012-03-10 9 views
4

以前にOracle DBにBLOBとして格納されていたプロトコルバッファメッセージを読み取ろうとしています。 私はデータ読み取りにPython用のpython + Googleのプロトコルバッファを使用しています:OracleのBLOBとして格納されているプロトコルバッファ:pythonの取得に失敗しました。

のOracle 11gの
のpython 2.6.7
Googleのプロトコル・バッファー2.4.1メッセージの

解析することは結構です:それはしていません例外を返します。

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はcx_OracleによってオブジェクトにラップされたLOBロケータを提供します。したがって、この例では、dataDB [0]は文字列ではなくcx_Oracle.LOBオブジェクトです。 ParseFromStringがどのようにコード化されているかによって、文字列に正しく変換される場合とされない場合があります。

したがって、私はparseFromStringのパラメータとしてdataDB [0] .read()を使用します。

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のサイズがnullではないことを確認しますが、それを解析することはまだ失敗します。 – user1261609

関連する問題