Задать вопрос
@Hyap5757
Познающий мир

Как можно сравнить полученный ботом id пользователя с каждым id из БД SQLite с помощью цикла?

Делаю бота на aiogram, использую базу данных SQLite.
Мне нужно проверить полученный id пользователя с каждым id уже имеющимся в базе данных с помощью цикла(просто как иначе я не знаю, если знаете подскажите пожалуйста как можно быстрее это сделать). Если проверяемый id будет соответствовать тому, что в базе, то пользователю бот отправляет сообщение вроде: "вы успешно авторизовались, вот ваш профиль", если же айди не соответствует ни одному из - то есть нет такого в базе данных, то бот переходит к процессу регистрации пользователя и там уже пойдут FSMcontext, стейты и тд. Мне нужно понять как реализовать проверку айди, весь инет перерыл, везде примеры с import sqlite3, cursor.fetchal, но ничего не работает, может я что-то не так делаю.

@user_registration_router.message(StateFilter(None), CommandStart())
async def cmd_start_dating(message: types.Message, state: FSMContext):
    con = sqlite3.connect("data_base.db")
    cursor = con.cursor()
    cursor.execute("SELECT user_id FROM userdatabase")

    user_id_massive = cursor.fetchall()  

    if message.from_user.id in [user_id[0] for user_id in user_id_massive]:
        await message.answer('Вы успешно авторизировались!')
        await message.answer('Вы в главном меню!')
    else:
         await message.answer('К сожалению Вы ещё не зарегистрированы в сервисе!')
         time.sleep(1.5)        
         await state.update_data(user_id=message.from_user.id)
         await message.answer('Укажите ваш пол ⬇️', reply_markup=GENDER_KB)
         await state.set_state(DataUsers.gender)
  • Вопрос задан
  • 116 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
@TheDigitalMadness
Программист
Смотри: у тебя в user_id_massive содержаться id не в цифровом виде, а в кортеже. Тогда, тебе достаточно просто привести message.from_user.id к кортежу
current_user_id = tuple([message.from_user.id])
if current_user_id in user_id_massive:
    ....
Ответ написан
@Hyap5757 Автор вопроса
Познающий мир
Так, ну я нашёл способ решения моей проблемы, в итоге пришлось прибегнуть к WHERE и обошёлся я без циклов, чуваки, кто жоско в этом шарит, оцените пожалуйста, может ли мой способ являться оптимальным решением проблемы авторизации? Потому что как бы и наличие айди в бд проверяет и после пользователю выдаёт что нужно.
@user_registration_router.message(StateFilter(None), CommandStart())
async def cmd_start_dating(message: types.Message, state: FSMContext):
    con = sqlite3.connect("data_base.db")
    cursor = con.cursor()
    cursor.execute(f"SELECT user_id FROM userdatabase WHERE user_id = {message.from_user.id}")

    user_id_massive = cursor.fetchall() 

    if user_id_massive:
        await message.answer('Вы успешно авторизировались!')
        await message.answer('Вы в главном меню!')   
    else:
        await message.answer('К сожалению Вы ещё не зарегистрированы в сервисе!')
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
никак, цикл тут не нужен, нужен учебник по SQL и минимум читать от начала до раздела про WHERE

time.sleep(1.5) вот еще один фейл

PS 100500 раз сказано, написание ботов не лучший способ учить питон, скорее один из худших.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы