在我的应用程序中,我使用带有“文本”列的 postgresql 数据库表来存储
腌制的python对象。
作为数据库驱动程序,我使用 psycopg2,直到现在我只将 python 字符串(不是 unicode 对象)传递给数据库并从数据库中检索字符串。这基本上工作正常,直到我最近决定以更好/正确的方式进行字符串处理并将以下构造添加到我的数据库层:
psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)
这基本上在我的应用程序中的任何地方都可以正常工作,并且我现在尽可能使用 unicode 对象。
但是对于包含腌制对象的文本列的这种特殊情况,它会带来麻烦。我让它在我的测试系统中以这种方式工作:
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)
最佳答案
问题是将 text
转换为 bytea
并不意味着将字符串中的字节组合为 bytea
值,而是将字符串解释为 bytea
类型的转义输入值。所以这行不通,主要是因为泡菜数据包含大量反斜杠,bytea
专门解释了这些反斜杠。
试试这个:
SELECT convert_to(data, 'LATIN1') ...
这会将字符串转换为 LATIN1 编码中的字节序列(
bytea
值)。对你来说,确切的编码并不重要,因为它都是 ASCII(但没有 ASCII
编码)。关于python - 无法将PostgreSQL文本列转换为bytea,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19300113/