在我的应用程序中,我使用的是一个带有“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的字符。
答案 0 :(得分:6)
问题是将text
转换为bytea
并不意味着,取字符串中的字节并将它们组合为bytea
值,而是取字符串并解释它作为bytea
类型的转义输入值。所以这不起作用,主要是因为pickle数据包含许多反斜杠,bytea
特别解释。
请改为尝试:
SELECT convert_to(data, 'LATIN1') ...
这会将字符串转换为LATIN1编码中的字节序列(bytea
值)。对你而言,确切的编码并不重要,因为它都是ASCII(但没有ASCII
编码)。