Изображение в базе данных
Скажите, как в бд 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 шт):
Картинку в самой бд лучше не хранить. Обычно делается так. Картинка сохраняется на диск, а в базе прописывается путь. Таким образом картинку ты сможешь показать не выполняя запрос к базе, как минимум. Если тебе все таки очень надо, то есть 2 варианта
- Поле в таблице должно быть байтовым, а картинку ты должен читать как набор байтов.
- Поле должно быть строковым, а картинку закодировать в base64
А у тебя сейчас картинка это набор байтов, а в поле должна быть строка. Сразу говорю, что если ты попытаешься выполнить преобразование контента картинки в строку, то поломаешь картинку. Если в строку то только через кодирование в base64
Поле объявите как 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])