代码之家  ›  专栏  ›  技术社区  ›  Great Turtle

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

  •  4
  • Great Turtle  · 技术社区  · 15 年前

    我今天在我们的一个项目中遇到了三次这个bug。将问题和解决方案联机,以供将来参考。

    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中的“can't adapt”(无法适应)错误。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Great Turtle    15 年前

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

    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
  •  1
  •   piro    15 年前

    当psycopg不知道您的 long_blob 变量。它是什么类型的?

    你可以很容易 register an adapter 告诉psycopg如何转换数据库的值。

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