python - 存储为 Oracle BLOB : python retrieve fails 的 Protocol Buffer

标签 python oracle blob protocol-buffers

我正在尝试读取以前作为 BLOB 存储在 Oracle 数据库中的 Protocol Buffer 消息。 我正在使用 python + python 的 google Protocol Buffer 来读取数据:

甲骨文 11g
python 2.6.7
谷歌 Protocol Buffer 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())

有什么想法吗? 干杯。

最佳答案

没有指定是用哪个模块访问Oracle,所以我假设是cx_Oracle。

当从 Oracle 读取 LOB 时,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() 方法通常在序列化时用于计算序列化消息的大小。我不确定它是否可以在解析消息后立即使用。在 Protocol Buffer API 中,ByteSize() 显然与序列化相关联。在解析时调用它实际上是没有意义的,因为缓冲区的大小在解析之前就已经知道了。

关于python - 存储为 Oracle BLOB : python retrieve fails 的 Protocol Buffer ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650820/

相关文章:

php - 在 PHP 中,如何使用 HTML 内容显示数据库中 BLOB 字段中的各种图像?

python - 使用 Matplotlib Python 创建箱线图

python - pytesseract : error with attributes

java - 在不更改默认 Java 的情况下安装 Oracle JRE 的最佳方法?

database - Oracle DB 监听器是否仅绑定(bind)到私有(private) ip 地址?

sql - 为什么对具有 blob 的表进行 Select SQL 查询很慢,即使未选择 blob 也是如此?

python - 如何在 matplotlib/pylab 图表中水平打印 Y 轴标签?

python - Django 模型继承和外键

windows - 如何防止 oracle 数据库在 windows 启动时启动?

javascript - 从 Uint8Array 创建的 Blob 的大小给出了无意义的值