Буферы протокола, хранящиеся как Oracle BLOB: сбой при получении python - PullRequest
4 голосов
/ 11 марта 2012

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

oracle 11g
python 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())

Есть идеи?Приветствия.

1 Ответ

0 голосов
/ 11 марта 2012

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

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

...