2012-03-10 1 views
4

Я пытаюсь прочитать сообщение bufferbuffer, ранее сохраненное как BLOB в Oracle DB. Я использую питон + протокольный Google буфера для питона, чтобы прочитать данные:Буферы протокола, хранящиеся как Oracle BLOB: python retrieve failed

оракул 11g
питона 2.6.7
протокол Google буферных 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()) 

Любая идея? Cheers.

ответ

0

Не указано, какой модуль используется для доступа к Oracle, поэтому я предполагаю, что это cx_Oracle.

Когда объект LOB считывается из Oracle, 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() явно связан с сериализацией. На самом деле бессмысленно называть его во время разбора, так как размер буфера уже известен до разбора.

+0

На самом деле я уже пробовал метод чтения LOB, но тот же результат. Размер был добавлен только для целей отладки, поскольку я не мог заставить его работать. С вашим кодом я подтверждаю, что размер LOB не равен NULL, но анализ его по-прежнему не выполняется :( – user1261609