Ayrat-Developer
@Ayrat-Developer

Как отправлять по очереди данные заказа по команде «Дальше» из БД Sqlite3?

Привет! Делаю бота по типу попутчиков на 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 (или кликнуть)")


Вот структура БД
610be21a898e8089092251.jpeg

Еще как вариант есть оставить этот способ, но под каждым добавить Inline-кнопку 'Забронировать', типо пользователь сам будет выбирать из количество который пришлет бот. После того как нашел подходящий заказ, нажимает Забронировать и всё место забронировано, но мне кажется, что будет маленькая производительность, если будет отправляться большое количество записей.

Вот как работает код, который я прикрепил
610be1d42567f546753898.jpeg
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Ответ очевиден. Тебе нужно для пользователя хранить, на какой позиции он остановился, и продолжать оттуда.
Простой способ - использовать модификаторы OFFSET и LIMIT в SQL запросе. Тогда достаточно будет хранить просто число, которое будет использоваться в OFFSET. При начальном запросе это число ставить в 0, а по нажатию дальше - увеличивать на значение LIMIT.

Технически это можно оформить таблицей БД с парами "id пользователя - число".
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы