Изображение в базе данных

Скажите, как в бд sqlite3 можно добавить изображение?
Нашел в интернете код, попробовал вставить сначала число, всё работает.
Но когда пытаюсь сделать то же самое, но с изображением, возникает ошибка:

    cur.execute(query)
sqlite3.OperationalError: near "'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x0.........0>

Есть бд с названием f, в ней таблица с названием foods, в ней колонки:

Name | Energy | Photo

Пока в колонке Photo указал тип STRING (не знаю какой лучше указывать для изображений)
В колонке Photo хочу добавить фотографию:

import sqlite3

def import_pict_binary(pict_path):
    f = open(pict_path, 'rb')
    pict_binary = f.read()
    return pict_binary


con = sqlite3.connect("f.sqlite")
cur = con.cursor()
binary_pict = import_pict_binary('corn.jpg')
query = "UPDATE foods SET Photo = {} WHERE Name = 'Кукуруза'".format(binary_pict)
cur.execute(query)
con.commit()

Скажите, что я неверно указал в запросе?


Ответы (2 шт):

Автор решения: alex

Картинку в самой бд лучше не хранить. Обычно делается так. Картинка сохраняется на диск, а в базе прописывается путь. Таким образом картинку ты сможешь показать не выполняя запрос к базе, как минимум. Если тебе все таки очень надо, то есть 2 варианта

  1. Поле в таблице должно быть байтовым, а картинку ты должен читать как набор байтов.
  2. Поле должно быть строковым, а картинку закодировать в base64

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

→ Ссылка
Автор решения: gil9red

Поле объявите как BLOB а для добавления картинки оборачивайте ее байты в sqlite3.Binary.

Пример:

con = sqlite3.connect('test.sqlite')
cur = con.cursor()
cur.execute('''
CREATE TABLE IF NOT EXISTS Images (
    Data BLOB
)
''')
con.commit()

with open('capture.png', mode='rb') as f:
    binary = sqlite3.Binary(f.read())

    cur.execute("INSERT INTO Images(Data) VALUES (?)", (binary,))
    con.commit()

# Из базы вернутся уже байты из файла картинки
for (img_data,) in con.execute("SELECT Data from Images"):
    print(img_data[:100])
→ Ссылка