使用Python + psycopg2处理二进制数据(DB:Postgres 9.5)

时间:2017-07-04 13:15:34

标签: python psycopg2

让我说我有列id的表测试( bigint 类型)&数据( bytea 类型)。

当我在Python中执行以下查询时,我不想显示数据列中的实际二进制数据。

select * from test;

我只想要一个显示<binary data><BLOB>的占位符,因为该列中的某些数据位于数百MB中,在列中显示二进制数据没有任何意义。 enter image description here

是否可以在psycopg2中使用占位符识别和替换二进制数据?

#!/usr/bin/python

import psycopg2

conn = psycopg2.connect(database = "testdb", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")
print "Opened database successfully"

cur = conn.cursor()

cur.execute("SELECT id, data from test")
rows = cur.fetchall()
for row in rows:
   print("ID = ", row[0])
   print("DATA = ", row[1])


print "Operation done successfully";
conn.close()

我们从数据库中获取结果并从结果生成html报告,这里用户可以在html文本框中提供任何查询,因此查询不是静态的,我们执行该查询并生成html表。这是内部报告生成脚本。

1 个答案:

答案 0 :(得分:0)

如果数据是bytea,您可以将自己的bytea类型编写为包装二进制字符串的对象。

请注意,无论如何都会在网络上提取和发送数据。如果你不想要这个开销,就不要选择那些字段。

>>> import psycopg2

>>> class Wrapper:
...     def __init__(self, thing):
...         self.thing = thing
...         

>>> psycopg2.extensions.register_type(
...     psycopg2.extensions.new_type(
...         psycopg2.BINARY.values, "WRAPPER", lambda x, cur: Wrapper(x)))

>>> cnn = psycopg2.connect('')
>>> cur = cnn.cursor()
>>> cur.execute("create table btest(id serial primary key, data bytea)")
>>> cur.execute("insert into btest (data) values ('foobar')")
>>> cur.execute("select * from btest")
>>> r = cur.fetchone()
>>> r
(1, <__main__.Wrapper instance at 0x7fb8740eba70>)
>>> r[1].thing
'\\x666f6f626172'

请参阅所用extensions函数的文档。