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

发布于 2024-08-19 17:41:35 字数 332 浏览 9 评论 0原文

今天我在我们的一个项目中遇到了这个错误 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 的错误“无法适应”。

I ran across this bug three times today in one of our projects. Putting the problem and solution online for future reference.

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])

This will fail with the error "can't adapt" from psycopg2.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

迷爱 2024-08-26 17:41:35

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

The problem is struct.unpack returns a tuple result, even if there is only one value to unpack. You need to make sure you grab the first item from the tuple, even if there is only one item. Otherwise psycopg2 sql argument parsing will fail trying to convert the tuple to a string giving the "can't adapt" error message.

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])
皓月长歌 2024-08-26 17:41:35

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

您可以轻松注册适配器来告诉psycopg如何转换数据库的值。

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

"Can't adapt" is raised when psycopg doesn't know the type of your long_blob variable. What type is it?

You can easily register an adapter to tell psycopg how to convert the value for the database.

Because it is a numerical value, chances are that the AsIs adapter would already work for you.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文