Подскажите что исправить, чтоб поиск перебрал все поля таблицы и выдал все совпадения искомого имени

Есть код поиска по имени в таблице БД. Он работает. Найдя первое совпадение, дальше не ищет. Подскажите что исправить или добавить, чтоб поиск перебрал все поля таблицы и выдал все совпадения искомого имени.

@router.message(Command('find'))
async def find(message: types.Message, state: FSMContext):
    await state.set_state(Reg.find) #
    if message.from_user.id == admin or message.from_user.id == admin2:
        await message.answer('Кого ищем?')
    else:
        await state.clear()
        return

@router.message(Reg.find)
async def albas2(message: types.Message, state: FSMContext):
    await state.update_data(find=message.text) # запоминает ранее введенное значение
    data = await state.get_data()
    dt = data["find"]
    await state.clear()
    async with session_maker() as session:
        alltab = await session.scalars(select(User).order_by(desc(User.id)))
        for alltab in alltab:
            if dt == alltab.username:
                await message.answer(f'Искомый объект: {alltab.id, alltab.tg_id, alltab.username, 
                                      alltab.is_active, alltab.k_msng}')
                return
        else:
            await message.answer('Нет такого в базе')
        return

Ответы (1 шт):

Автор решения: Pak Uula

Ну, вопервЫх, крайне неэффективно выкачивать всю таблицу, чтобы затем искать строку по полю.

Сделайте select().where() и сразу доставайте из таблицы только те кортежи, где искомое имя: select(User).where(User.username == dt). Если вам нужно, чтобы dt искалось в нескольких полях, напишите в where несклько условий:

select(User).where(User.username == dt, User.another_name == dt, User.one_more_name == dt)

Теперь вовтОрых. Когда вы в цикле находите искомую строку, то сразу отправляете ответ

                await message.answer(f'Искомый объект: {alltab.id, alltab.tg_id, alltab.username, 
                                      alltab.is_active, alltab.k_msng}')
                return

То есть вы отправляете первый найденный объект. Судя по вопросу, вас это не устраивает. Что вам нужно? Вернуть все объекты, удовлетворяющие критерию? Ну так и соберите это всё в строку:

rows = select(User).where(User.username == dt).order_by(desc(User.id)))
objs = [f"{r.id,r.tg_id,r.username,r.is_active,r.k_msng}" for r in rows]
message.answer(f"Искомые объекты: {objs}")

Не тестировал, но выглядит работоспособно.

→ Ссылка