Подскажите что исправить, чтоб поиск перебрал все поля таблицы и выдал все совпадения искомого имени
Есть код поиска по имени в таблице БД. Он работает. Найдя первое совпадение, дальше не ищет. Подскажите что исправить или добавить, чтоб поиск перебрал все поля таблицы и выдал все совпадения искомого имени.
@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 шт):
Ну, вопервЫх, крайне неэффективно выкачивать всю таблицу, чтобы затем искать строку по полю.
Сделайте 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}")
Не тестировал, но выглядит работоспособно.