如何从Python将整数写入(hex) bytea字段

1 投票
1 回答
671 浏览
提问于 2025-04-16 22:48

问题是这样的:在(pl)python代码中,我们计算出了一个整数 = 26663。

我们可以很简单地把这个整数转换成十六进制,方法是用 hex(myint),结果是 0x6827。

到这里一切都很好!

接下来,如何把这个值写入一个 PostgreSQL(版本9)的 bytea 字段呢?数据库是 UTF8 编码的,这个可能有点关系。

举个例子,这两个方法都不行:

在这里,我当然不能把 'str' 和 'int' 这两种类型的东西拼接在一起:

rv = plpy.execute(plan, [ (string1 + 6827) ])

这个方法输入的十六进制代码是错误的,应该是 0x6827。

rv = plpy.execute(plan, [ (string1 + str('6827')) ])

求助!

1 个回答

2

我对Postgres不太熟悉,但hex(n)这个函数会把数字n转换成十六进制的字符串。个人觉得,最简单的把这个字符串和其他字符串拼接的方法是使用格式化字符串。例如:

rv = plpy.execute(plan, [ ( 'foo %s bar' % hex(6827) ) ] )

如果这个字符串真的存储在一个叫string1的变量里,而你只想把它和十六进制值拼接起来,那么直接用+号拼接就可以了:

rv = plpy.execute(plan, [ ( string1 + hex(6827) ) ])

这样做不需要转换,因为hex()函数返回的本身就是字符串。

如果你不想存储一个可打印的字符串,而是想要一个二进制字符串,可以使用struct模块来创建一个字节数组。

import struct
bytes = struct.pack('i', 6827) # Ignoring endianness

很多人对“以二进制形式存储”是什么意思感到困惑,既然你使用的字段类型是bytea,看起来是为了二进制存储而设计的,也许这正是你想要的?

从bytes返回的值会是一个字符串,你可以把它和另一个字符串拼接,或者继续往里面添加更多的二进制值。

想了解更多信息,可以查看struct模块的文档

撰写回答