让我说我有列id的表测试( bigint 类型)&数据( bytea 类型)。
当我在Python中执行以下查询时,我不想显示数据列中的实际二进制数据。
select * from test;
我只想要一个显示<binary data>
或<BLOB>
的占位符,因为该列中的某些数据位于数百MB中,在列中显示二进制数据没有任何意义。
是否可以在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表。这是内部报告生成脚本。
答案 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
函数的文档。