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

时间:2010-01-27 18:53:29

标签: python postgresql psycopg2 unpack iterable-unpacking

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

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中的“无法适应”错误。

2 个答案:

答案 0 :(得分:4)

问题是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])

答案 1 :(得分:1)

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

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

因为它是一个数值,所以AsIs适配器可能已经适合你。