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

    10-10 18:23