Привет! Делаю бота по типу попутчиков на Aiogram и используя БД Sqlite3. Застрял на том, что когда нужно искать заказы, не могу выводить по очереди данные заказа после команды "Дальше", здесь цикл и он выводит все, ну как бы я понял уже почему, но перепробовал способы еще некоторые, все равно не получилось, как можно сделать, чтобы выводился следующая строка из БД с данными заказа?
Вот код функции поиска заказов:
@dp.message_handler(commands="search_order", state=None)
async def cmd_search_order(message: types.Message):
# Проверка, зарегестрирован ли пользователь, есть ли он в БД
query_passenger_table = f'SELECT * FROM passengers WHERE id_passenger={message.from_user.id}'
query_drivers_table = f'SELECT * FROM drivers WHERE id_driver={message.from_user.id}'
check, check_passenger, check_driver = checking(query_passenger_table, query_drivers_table)
if check == 1:
# Проверка типа пользователя
query_passenger_table = f'SELECT * FROM passengers WHERE id_passenger={message.from_user.id}'
query_drivers_table = f'SELECT * FROM drivers WHERE id_driver={message.from_user.id}'
check, check_passenger, check_driver = checking(query_passenger_table, query_drivers_table)
if check_passenger == 1:
await message.answer('Выполняется поиск... Нажмите на кнопку "Дальше"', reply_markup=markup)
@dp.message_handler(Text(equals="Забронировать"))
async def with_puree(message: types.Message):
# Сделать проверку на уже забронироавнные 2 места (добавить колонки в таблицу с заказом)
await message.reply("Место забронировано! Уведомление отправлено водителю. \
Он может с вами \связаться в личных сообщениях, вы тоже \
можете с ним связаться, в заказе есть его данные для связи")
@dp.message_handler(lambda message: message.text == "Дальше")
async def without_puree(message: types.Message):
connection = create_connection(PATH_DB)
cursor = connection.cursor()
query = "SELECT from_where, where_to, date, time, price, free_places, car_and_id, username FROM driver_orders"
cursor.execute(query)
while message.text == "Дальше":
next_row = cursor.fetchone()
if next_row:
await bot.send_message(message.chat.id,
md.text(
md.text('Связь: ', '@'+ str(next_row[7])),
md.text('Откуда: ', next_row[0]),
md.text('Куда: ', next_row[1]),
md.text('Дата: ', next_row[2]),
md.text('Время: ', next_row[3]),
md.text('Цена: ', next_row[4]),
md.text('Количество свободных мест: ', next_row[5]),
md.text('Машина: ', next_row[6]),
sep='\n',
),
reply_markup=markup
)
else:
await message.answer("Заказы закончились. Начать поиск заново?")
break
elif check_driver == 1:
await message.answer("Водители - /create_order")
else:
await message.answer("Вы не зарегестрированы! Для регистрации введите /reg (или кликнуть)")
Вот структура БД
Еще как вариант есть оставить этот способ, но под каждым добавить Inline-кнопку 'Забронировать', типо пользователь сам будет выбирать из количество который пришлет бот. После того как нашел подходящий заказ, нажимает Забронировать и всё место забронировано, но мне кажется, что будет маленькая производительность, если будет отправляться большое количество записей.
Вот как работает код, который я прикрепил