从python,如何将整数写入(十六进制)bytea字段

时间:2011-08-03 16:02:20

标签: python postgresql plpython

问题是:在(pl)python代码中,我们计算了一个整数= 26663。 可以使用hex(myint)= 0x6827

轻松将其转换为十六进制

到目前为止一切顺利!

现在,如何将此值 - 连接到字符串串联 - 写入PostgreSQL(v9)bytea字段?如果这很重要,则DB是UTF8编码的。

EG,这些例子都不起作用:

当然,我无法连接'str'和'int'对象:

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

这个输入错误的十六进制代码0x6827

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

帮助!

1 个答案:

答案 0 :(得分: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 module documentation