【问题标题】:psycopg2 converting memoryview back to array of psycopg2.binary objectspsycopg2 将 memoryview 转换回 psycopg2.binary 对象数组
【发布时间】:2020-07-17 10:53:23
【问题描述】:

正如标题所说, 我在我的 postgresql 数据库中插入了一堆图像,这些图像添加到一个数组中,并使用光标发送到数据库。 db 中的列是 bytea[],所以它对我有用。

我使用这段代码sn-p将图像字节流转换为二进制,放入数组并发送到db

somearray.append(psycopg2.Binary(image.content))

但是当运行一个 select 语句从数据库中获取该数组时,我得到的是一个 memoryview,我现在不确定如何将它转换回一个数组。

在研究之后我真的迷失了,因为大多数帖子告诉我使用 toByte() 将 memoryview 转换为一些字节字符串,但我的目标是将 memoryview 转换为数组或二进制项以转换回来将二进制文件转换为图像。

【问题讨论】:

  • 当您说要将它们转换回图像时,您的目标是将图像写入文件吗?如果是这样,您可以使用open('target_file.jpg','wb+).write(memory_view_obj) 来执行此操作(file.write 可以获取内存视图对象,不需要先将其转换为字节)。你打算用字节做什么?
  • 道歉,但我认为你误解了我,我所做的是创建一个 bytea 数组数组。当你查看 postgresql 中的数据类型时,它说 byea[] 而不是 bytea。我发送此类数据的方法是使用 pscopg2 将图像转换为二进制,并将其添加到数组中。然后我将它作为一个填充了二进制图像的数组发送到 postgresql。现在从 postgresql(bytea [] - 不是 bytea)获取它,我得到一个 memoryview,我需要将它转换回二进制项数组。这就是我现在卡住的地方
  • 啊,你说得对,我没有看到你使用 bytea[] 的那部分。您是在每个字节数组中插入多个图像,其中数组中的每个元素都代表一个图像,还是每个 bytea[] 代表一个图像?如果是第一个,那么您可以使用以下代码获取图像。 cursor.execute("select byte_array from test"); image_sets = [row[0] for row in cursor.fetchall()]; images_as_bytes = [bytes(image) for image_array in image_sets for image in image_array];
  • 天哪,解决了!谢谢!您能否将其发布为答案,让我为您提供此解决方案!

标签: python arrays postgresql psycopg2


【解决方案1】:

供未来读者参考,该问题是指将多个图像插入每个字节数组,其中数组中的每个元素代表一个图像。您可以使用以下代码以字节形式获取图像。

cursor.execute("select byte_array from test")
image_sets = [row[0] for row in cursor.fetchall()]
images_as_bytes = [bytes(image) for image_array in image_sets for image in image_array]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多