Чтение BLOB-объектов из базы данных без сохранения на диск в Python - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь прочитать набор записей из базы данных, которая имеет поле blob. Я могу прочитать его, но не без предварительного сохранения на диск.

cursor.execute("select image ,id, 
department from dept_master")
depdata = cursor.fetchall()
for row in depdata:
    file_like = io.BytesIO(row[0])
    file = PIL.Image.open(file_like)
    target = os.path.join("/path-to-save/", 'folder-save')
    destination = "/".join([target, file.filename])
    file.save(destination) 

Как я могу прочитать его и отобразить без предварительного сохранения на диск?

1 Ответ

0 голосов
/ 06 апреля 2020

Я планирую использовать render_template для отображения данных

Чтобы обслуживать изображения из поля большого двоичного объекта, вам нужно создать отдельный маршрут, который будет обслуживать конкретные данные изображения, а затем в шаблон включайте ссылки, которые загружают файлы с этого маршрута.

Здесь нет необходимости использовать PIL, так как поле blob дает вам байтовые данные. Вы запускаете это через BytesIO, чтобы получить объект _io.BytesIO, который можно передать прямо в функцию Flask send_file.

from io import BytesIO
from flask import send_file

@app.route('/image/<int:ident>')
def image_route(ident):

    # This can only serve one image at a time, so match by id
    cursor.execute("select image from dept_master WHERE id = ?", (ident,)
    result = cursor.fetchone()
    image_bytes = result[0]

    bytes_io = BytesIO(image_bytes)

    return send_file(bytes_io, mimetype='image/jpeg')

На этом этапе вы сможете нажать /image/1 и посмотрите изображение в вашем браузере для строки с идентификатором 1.

Затем, где-нибудь в шаблоне, просто включите ссылку для этого с:

<img src='{{ url_for("image_route", ident=image_ident) }}' />

Это предполагает, что image_ident доступно в шаблоне. Возможно, вам придется заменить это имя переменной чем-то, что существует (это может быть переменная в пределах для l oop, которая обозначает идентификатор изображения для извлечения).

Дайте мне знать, если это требует дальнейшего объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...