Задать вопрос
ierarhsed
@ierarhsed
страдающий апатией любитель писать ботов

Aiogram — как отправить фото из sqlite пользователю не сохраняя на диск?

Допустим, у меня есть таблица products и в этой таблице есть столбец photo BLOB. Пользователю должна отправиться фотография товара при вызове. Из этого исходит вопрос - как это правильно сделать? Из идей имеется через io.BytesIO, но я буквально не знаю ни библиотеки io, ни как работают BLOB. В интернете нашел способы, как сохранять файлы из таблицы на диск, но это не то, что мне нужно.
  • Вопрос задан
  • 1353 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@puzaka
При отправке фото/файла боту, это фото/файл сохраняется на сервера телеграмма, и каждого такого файла есть свой file_id. Пример эхо бота, который присылает этот file_id, если прислать ему фото/файл:
@dp.message_handler(content_types=[ContentType.PHOTO, ContentType.DOCUMENT])
async def echo(message: Message):
    try:  # если отправил фото
        await message.answer(message.photo[-1].file_id)  # прислать ID фото
    except:  # если отправил файл
        await message.answer(message.document.file_id)  # прислать ID файла


Для начала нужно записать этот file_id в базу данных, это можно сделать вот так:
import sqlite3

connect = sqlite3.connect("name_of_your_db.db")
cursor = connect.cursor()

def AddTaskToDB(file_id):
    try:
        cursor.execute("INSERT OR IGNORE INTO `name_of_your_table` (`name_of_column`) VALUES(?)", (file_id))
        connect.commit()
    except sqlite3.Error as error:  # ошибка
        print(f'Error: {error}')


Затем получить file_id из базы данных:
import sqlite3

connect = sqlite3.connect("name_of_your_db.db")
cursor = connect.cursor()

def GetFileID():
    try:
        file_id = cursor.execute("SELECT `name_of_column` FROM `name_of_your_table`", ).fetchall()[0][0]
        return file_id
    except sqlite3.Error as error:  # ошибка
        print(f'Error: {error}')
        return "error"


Ну и чтобы отправить этот файл:
@dp.message_handler()
async def sendPhoto(message: types.Message):
    try:  # если file_id - это фото
        await message.answer_photo(GetFileID, 'описание фотографии')
    except:  # если file_id - это документ
        await message.answer_document(GetFileID, 'описание документа')
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы