首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres BYTEA编码和JSONB输出

Postgres BYTEA编码和JSONB输出
EN

Stack Overflow用户
提问于 2022-07-29 09:47:41
回答 1查看 77关注 0票数 0

我已经在Postgres之上构建了一个API,它是通过一个总是返回JSONB的PLPGSQL函数来路由的。例:-

代码语言:javascript
复制
SELECT api('{"method", "foo"}'::JSONB)

申报表:-

代码语言:javascript
复制
{
 "response_code" : 200,
 "data" : "...."
}

我想使用这个网关来呈现以PBF格式的向量块。我有一个函数create_vector_tile(x,y,z),它返回BYTEA,如果我将python脚本直接连接到它:-

代码语言:javascript
复制
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返回它,我该如何解码它?例如:-

代码语言:javascript
复制
RETURN json_build_object('response_code', 200, 'data', create_vector_tile(x,y,z))

Postgres自动在JSON对象中将bytea编码为字符串,但我不知道如何在python中解码它,以获得与直接调用相同的结果。我需要通过API来进行身份验证和日志记录。

EN

回答 1

Stack Overflow用户

发布于 2022-07-29 10:18:49

Postgresql的BYTEA是一个十六进制字符串,前面是\x。假设它使用正确转义的前导反斜杠到达,则可以使用bytes.fromhex将其转换为字节。

代码语言:javascript
复制
>>> 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'

如果反斜杠没有转义,这将起作用:

代码语言:javascript
复制
>>> 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'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73164748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档