9

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

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

这基本上在我的应用程序中的任何地方都可以正常工作,我现在尽可能使用 unicode-objects。

但是对于这种包含腌制对象的文本列的特殊情况,它会带来麻烦。我以这种方式在我的测试系统中工作:

  • 检索数据: 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 的字符。

4

1 回答 1

16

问题是转换textbytea并不意味着获取字符串中的字节并将它们组合为一个bytea值,而是获取字符串并将其解释为该bytea类型的转义输入值。所以这行不通,主要是因为pickle数据包含很多反斜杠,bytea专门解释。

试试这个:

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

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

于 2013-10-10T20:39:16.990 回答