无法将PostgreSQL文本列转换为bytea

时间:2013-10-10 15:31:42

标签: python postgresql psycopg2

在我的应用程序中,我使用的是一个带有“text”列的postgresql数据库表来存储 腌制的蟒蛇对象。 作为数据库驱动程序我正在使用psycopg2,直到现在我只将python-strings(不是unicode-objects)传递给DB并从DB中检索字符串。这基本上工作正常,直到我最近决定使String处理更好/更正的方式并将以下构造添加到我的DB层:

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

这在我的应用程序中无处不在,我现在正在使用unicode-object。

但对于包含pickle对象的text-column的这种特殊情况,它会造成麻烦。我通过这种方式在我的测试系统中工作:

  • 检索数据: SELECT data::bytea, params FROM mytable
  • 写入数据: execute("UPDATE mytable SET data=%s", (psycopg2.Binary(cPickle.dumps(x)),) )

...但不幸的是,我在生产系统中的某些列上遇到了SELECT错误:

psycopg2.DataError: invalid input syntax for type bytea

当我尝试在psql shell中运行查询时,也会发生此错误。

基本上我打算将列从“text”转换为“bytea”,但错误 上面也阻止我进行这种转换。

据我所知,(当将列检索为纯python字符串时)字符串中只有ord(c)< = 127的字符。

1 个答案:

答案 0 :(得分:6)

问题是将text转换为bytea并不意味着,取字符串中的字节并将它们组合为bytea值,而是取字符串并解释它作为bytea类型的转义输入值。所以这不起作用,主要是因为pickle数据包含许多反斜杠,bytea特别解释。

请改为尝试:

SELECT convert_to(data, 'LATIN1') ...

这会将字符串转换为LATIN1编码中的字节序列(bytea值)。对你而言,确切的编码并不重要,因为它都是ASCII(但没有ASCII编码)。