在我的应用程序中,我使用带有“文本”列的 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 的字符。