Проверка ID пользователя в Python и SQLite: исправляем ошибки

    При разработке ботов и серверных приложений часто возникает задача проверки идентификатора пользователя (user ID) в базе данных. В этой статье разберём типичную ошибку при сравнении переменной с результатом SQL-запроса и покажем правильный код. Вы узнаете, как избежать падения программы и выводить сообщение об ошибке, если ID не найден.

    Почему код не работает?

    В исходном коде есть несколько логических и синтаксических ошибок:

    • Функция check_adm возвращает True или False, но в main() её сравнивают с числом admiss. Это сравнение всегда ложно, так как функция возвращает булево значение, а не ID.
    • При отсутствии записи в БД cursor.fetchone() возвращает None, и функция корректно возвращает False. Однако программа завершается с ошибкой из-за неправильного условия в if.
    • В консоль выводится объект функции check_adm, а не результат её вызова.

    Как правильно проверить ID пользователя?

    Нужно вызывать функцию check_adm() (со скобками) и проверять её возвращаемое значение. Если пользователь не найден - выводить Error и завершать программу.

    Исправленный код

    import sqlite3
    
    admiss = 4545454446
    
    def check_adm(user_id):
        databaseFile = "data.db"
        db = sqlite3.connect(databaseFile, check_same_thread=False)
        cursor = db.cursor()
        cursor.execute('SELECT * FROM admin WHERE auser_id=?', (user_id,))
        result = cursor.fetchone()
        db.close()
        return result is not None
    
    def main():
        print("Выполняется проверка системы...")
        if not check_adm(admiss):
            print("Error")
            quit()
        else:
            print("Пользователь найден")
    
    if __name__ == '__main__':
        main()

    Что изменилось?

    • Функция принимает ID как аргумент - это делает код гибким.
    • Используется параметризованный запрос (?) для защиты от SQL-инъекций.
    • Соединение с БД закрывается после запроса.
    • Условие проверки стало логичным: если check_adm возвращает False - выводим ошибку.

    Дополнительные рекомендации

    Для работы с несколькими пользователями или ботами лучше хранить ID в переменной окружения или конфигурационном файле. Также стоит добавить обработку исключений при подключении к базе данных.

    Часто задаваемые вопросы