Бот не достает данные из базы данных
Подскажите, пожалуйста, почему асинхронный вызов функции в handlers не "достает" данные из базы данных и бот выводит "Рецепт не найден."?
#handlers.py
from aiogram.types import Message
from aiogram.dispatcher.filters import Command
from main import dp
from sql import recipes
@dp.message_handler(Command('persik'))
async def get_recipes(message: Message):
print('Получаем значение команды')
item = message.text.split(maxsplit=1)
print(item)
if not item:
await message.answer("Пожалуйста, укажите название рецепта.")
return
# Получаем информацию о рецепте из базы данных по указанному названию
recipe_info = await recipes(item)
print(recipe_info)
if not recipe_info:
await message.answer("Рецепт не найден.")
return
if len(recipe_info) < 2:
await message.answer("Информация о рецепте неполная.")
return
recipe_name = recipe_info[0]
recipe_ingredients = recipe_info[1]
await message.answer(f"Рецепт: {recipe_name}\nИнгредиенты: {recipe_ingredients}")
#sql.py
import sqlite3
async def recipes(item):
conn = sqlite3.connect('recipes.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM tort WHERE Команда = ?", (str(item),))
recipes_info = cursor.fetchall()
conn.close()
return recipes_info
#main.py
import asyncio
from aiogram import Bot, Dispatcher, executor
loop = asyncio.new_event_loop()
bot = Bot('6113793338:AAHcxo-4cGldzKqTgFpqDT2sWoJcEXVrqVc', parse_mode='HTML')
dp = Dispatcher(bot, loop=loop)
if name == 'main':
from handlers import dp
executor.start_polling(dp)
Ответы (1 шт):
Метод split
разделяет строку в массив по пробелам т.е. если на вход идёт строка "/persik somename" то результатом выполнения split
будет ["/persik", "somename"]
.
Почти уверен, что в бд рецепты не хранятся в таком виде. Так что нам нужно получить название рецепта для этого используем item[1]
(получить 2 элемент списка). recipe_info = await recipes(item[1])
Также проверку на существование имени нужно реализовать через len
:
if len(item) < 2:
await message.answer("Пожалуйста, укажите название рецепта.")
return
Также стоит учитывать что данным способом данные ищутся точно, то есть ошибись пользователь на символ и он ничего не найдёт. О том как это исправить можно посмотреть тут