使用python psycopg2保存二进制数据时如何修复“无法适应错误”

Posted

技术标签:

【中文标题】使用python psycopg2保存二进制数据时如何修复“无法适应错误”【英文标题】:How to fix "can't adapt error" when saving binary data using python psycopg2 【发布时间】:2010-01-27 18:53:28 【问题描述】:

我今天在我们的一个项目中遇到了这个错误 3 次。将问题和解决方案放到网上以供将来参考。

impost psycopg2

con = connect(...)

def save(long_blob):
     cur = con.cursor() 
     long_data = struct.unpack('<L', long_blob)
     cur.execute('insert into blob_records( blob_data ) values (%s)', [long_data])

这将失败,并出现来自 psycopg2 的错误“无法适应”。

【问题讨论】:

【参考方案1】:

问题是 struct.unpack 返回一个元组结果,即使只有一个值需要解包。您需要确保从元组中获取第一项,即使只有一项。否则 psycopg2 sql 参数解析将无法尝试将元组转换为给出“无法适应”错误消息的字符串。

impost psycopg2

con = connect(...)

def save(long_blob):
     cur = con.cursor() 
     long_data = struct.unpack('<L', long_blob)

     # grab the first result of the tuple
     long_data = long_data[0]

     cur.execute('insert into blob_records( blob_data ) values (%s)', [long_data])

【讨论】:

【参考方案2】:

当 psycopg 不知道您的 long_blob 变量的类型时,会引发“无法适应”。它是什么类型的?

您可以轻松register an adapter 告诉 psycopg 如何转换数据库的值。

因为它是一个数值,AsIs 适配器很可能已经为您工作了。

【讨论】:

在这种情况下,我的类型是二进制字符串,但包含在 struct.unpack 返回的元组中。类似于 ('0x001122') 而不是 '0x001122' 本身。我想我们可以做一个元组提取器,但现在这只是记录我们的错误。感谢您的回答。

以上是关于使用python psycopg2保存二进制数据时如何修复“无法适应错误”的主要内容,如果未能解决你的问题,请参考以下文章

如何为 python 2.7 安装 psycopg2

设置 psycopg2(PostGreSQL/python 数据库)时遇到问题

Python-PostgreSQL psycopg2 接口 --> executemany

Python支持SQL数据库返回psycopg2.ProgrammingError:在尝试删除表中的数据时,关系不存在错误?

使用 PostgreSQL (psycopg2) 和 Django 运行 Python 3.4 时出错

中断键时使用 psycopg2 终止未完成的 SQL 提交查询