Проверка 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 в переменной окружения или конфигурационном файле. Также стоит добавить обработку исключений при подключении к базе данных.