【发布时间】: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