我已经在Postgres之上构建了一个API,它是通过一个总是返回JSONB的PLPGSQL函数来路由的。例:-
SELECT api('{"method", "foo"}'::JSONB)申报表:-
{
"response_code" : 200,
"data" : "...."
}我想使用这个网关来呈现以PBF格式的向量块。我有一个函数create_vector_tile(x,y,z),它返回BYTEA,如果我将python脚本直接连接到它:-
query = DATABASE_CONNECTION.execute(create_vector_tile(%,%,%), [x,y,z])
ret = query.fetchone()[0]
self.send_response(200)
self.send_header("Access-Control-Allow-Origin", "*")
self.send_header("Content-type", "application/vnd.mapbox-vector-tile")
self.end_headers()
self.wfile.write(ret)如果我通过API返回它,我该如何解码它?例如:-
RETURN json_build_object('response_code', 200, 'data', create_vector_tile(x,y,z))Postgres自动在JSON对象中将bytea编码为字符串,但我不知道如何在python中解码它,以获得与直接调用相同的结果。我需要通过API来进行身份验证和日志记录。
发布于 2022-07-29 10:18:49
Postgresql的BYTEA是一个十六进制字符串,前面是\x。假设它使用正确转义的前导反斜杠到达,则可以使用bytes.fromhex将其转换为字节。
>>> bytea = '\\x1aa7360a0764656661756c7412820412e10300000101020203030404050506060707080809090a030b0a0c0b0d0c0e0d0f'
>>> bs = bytes.fromhex(bytea[2:])
>>> bs
b'\x1a\xa76\n\x07default\x12\x82\x04\x12\xe1\x03\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\x03\x0b\n\x0c\x0b\r\x0c\x0e\r\x0f'如果反斜杠没有转义,这将起作用:
>>> bytea = '\x1aa7360a0764656661756c7412820412e10300000101020203030404050506060707080809090a030b0a0c0b0d0c0e0d0f'
>>> escaped = bytea.encode('unicode-escape').decode('ascii')
>>> bytes.fromhex(escaped[2:])
b'\x1a\xa76\n\x07default\x12\x82\x04\x12\xe1\x03\x00\x00\x01\x01\x02\x02\x03\x03\x04\x04\x05\x05\x06\x06\x07\x07\x08\x08\t\t\n\x03\x0b\n\x0c\x0b\r\x0c\x0e\r\x0f'https://stackoverflow.com/questions/73164748
复制相似问题