Как вывести данные из БД в сообщение телеграм-бота (aiogram)
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, а не значение из БД. Как пофиксить?
Источник: Stack Overflow на русском