可以可靠地将一个pickle对象编码为Postgres字符串(用于发送NOTIFY)吗?

1 投票
1 回答
1610 浏览
提问于 2025-04-17 18:11

Postgres的NOTIFY功能只支持字符串类型的数据(不能用二进制数据)。我找到了一种方法,可以用它来处理一个被序列化的对象,具体做法如下:

message = cPickle.dumps(objectFoo)
cursor = connection.cursor() # this is psycopg2 connection
cursor.execute("NOTIFY channelFoo, %s", [message])

不过,如果我在这个编码的对象里放了一些特殊的字节(比如'\x80'这个字符串),那么在执行execute()时就会出现错误:

psycopg2.DataError: 对于编码“UTF8”,无效的字节序列:0x80

有没有什么办法可以解决这个问题?也就是说,能不能找到一种方法,让我可以可靠地把被序列化的对象转换成Postgres能接受的字符串,无论这个对象里包含什么数据?

1 个回答

5

Python的pickle是一种二进制字节序列。如果你想把pickle放进一个字符串里,就需要进行编码。常用的方法包括使用base64或uuencode。然后在接收方再进行解码。

撰写回答