Как вывести данные из БД в сообщение телеграм-бота (aiogram)

Рейтинг: 0Ответов: 1Опубликовано: 29.01.2023
from aiogram import Bot, Dispatcher, types, executor
from aiogram.types import CallbackQuery
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
import keyboards
from aiogram.dispatcher.filters import Text
from database import Database
from config import BOT_TOKEN, admin_id
from aiogram.dispatcher.filters.state import State, StatesGroup

bot = Bot(token=BOT_TOKEN, parse_mode='HTML')
dp = Dispatcher(bot, storage=MemoryStorage())
db = Database('database.db')


class Answer(StatesGroup):
    user_send_text = State()
    admin_answer = State()


@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
    if(not db.user_exists(message.from_user.id)):
        db.add_user(message.from_user.id)
        await bot.send_message(admin_id, f'<b>👤 Зашел новый пользователь: @{message.from_user.username}</b>')
    await message.answer('<b>👋 Привет!\n\n✅ Чтобы получить обратную связь, используй кнопки, расположенные ниже</b>',
                         reply_markup=keyboards.menu_keyboard)


@dp.message_handler(content_types=['text'])
async def cmd_keyboard(message: types.Message):
    if message.text == '🎯 Получить товар':
        await message.answer('🙏 Пожалуйста, укажите ID заказа <b>(укажите только цифры)</b>:')
        await Answer.user_send_text.set()


@dp.message_handler(state=Answer.user_send_text)
async def state_sended(message: types.Message, state: FSMContext):
    db.set_user_text(message.from_user.id, int(message.text))
    await message.answer(f'<b>✅ Заявка успешно отправлена!\n\n'
                         f'Ожидайте выдачи товара, обычно это происходит в течение '
                         f'1-2 часов с момента подачи заявки</b>')
    await bot.send_message(admin_id, f'Поступила заявка от {message.from_user.id}\n'
                                     f'ID заказа: {db.select_order(message.from_user.id)}')

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Модуль БД:

import sqlite3


class Database:
    def __init__(self, db_file):
        self.connection = sqlite3.connect(db_file)
        self.cur = self.connection.cursor()

    def add_user(self, user_id):
        with self.connection:
            result = self.cur.execute("INSERT into `info` (`user_id`, `order_id`) VALUES (?, 0)", (user_id,))
            self.connection.commit()
            return result

    def user_exists(self, user_id):
        with self.connection:
            result = self.connection.execute("SELECT * FROM `info` WHERE `user_id` = ?", (user_id,)).fetchall()
        return bool(len(result))

    def set_user_text(self, user_id, order_id):
        with self.connection:
            result = self.cur.execute("UPDATE `info` SET `order_id` = ? WHERE `user_id` = ?", (order_id, user_id))
            self.connection.commit()
            return result

    def select_order(self, user_id):
        order_id = 0
        with self.connection:
            self.cur.execute("SELECT 'order_id' FROM 'info' WHERE 'user_id' = ?", (user_id,))
            results = self.cur.fetchall()
            for row in results:
                print(int(row[0]))

            return order_id

Суть в чем: функция select_order почему-то возвращает значение 0, а не значение из БД. Как пофиксить?

Ответы

▲ 0

Скорее всего, проблема в SQL запросе. Попробуйте сделать запрос напрямую к базе данных и проверить, будет ли выводиться результат с указанным user_id.