gpt4 book ai didi

python - 无法将 PostgreSQL 文本列转换为 bytea

转载 作者:太空狗 更新时间:2023-10-29 22:26:43 25 4
gpt4 key购买 nike

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

最佳答案

问题是,将text 转换为bytea 并不意味着,将字符串中的字节组合成一个bytea 值,而是获取字符串并将其解释为 bytea 类型的转义输入值。所以这行不通,主要是因为 pickle 数据包含大量反斜杠,bytea 对此进行了特殊解释。

试试这个:

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

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

关于python - 无法将 PostgreSQL 文本列转换为 bytea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19300113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com