使用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保存二进制数据时如何修复“无法适应错误”的主要内容,如果未能解决你的问题,请参考以下文章
设置 psycopg2(PostGreSQL/python 数据库)时遇到问题
Python-PostgreSQL psycopg2 接口 --> executemany
Python支持SQL数据库返回psycopg2.ProgrammingError:在尝试删除表中的数据时,关系不存在错误?