Ваш перерыв никогда не выполняется, потому что Python не может туда добраться .Во-первых, ваш while
отступ цикла отличается:
while True:
# do things
if results is True:
# loop with break
Разрыв не может выйти из цикла while True
, потому что он не является частью этого цикла .
Сначала нужно настроить отступ:
while True:
# do things
if results:
# loop with break
Затем вы проверите, является ли results
тем же объектом, что и объект True
:
if results is True:
# ...
Это никогда не будет истинным, потому что cursor.fetchall()
всегда будет создавать список.Если вы хотите проверить, не является ли список пустым, просто используйте:
if results:
# ...
Оператор if
уже проверяет , является ли что-то истинным или нет , и вам почти никогда не понадобитсяиспользовать is True
или == True
в Python.
Далее вы используете break
в цикле for
, поэтому цикл for
будет завершен, а не цикл while
.Таким образом, даже если вы исправите структуру следующим образом:
while True:
# ...
if results:
for i in results:
# ...
break
, цикл for
будет разорван.Цикл while True:
будет успешно продолжен.
Вы можете добавить еще одну break
в структуру:
while True:
# ...
if results:
for i in results:
# ...
break
break
, но это все становится немного .. многословным.Поскольку вы знаете, что results
не пусто, вы можете удалить цикл for
и использовать:
while True:
# ...
if results:
i = results[0]
print("Welcome "+i[1])
break
Если вы просто хотели получить один результат, вам не нужно извлекать все строки, которые соответствуютпросто первая строка, поэтому используйте cursor.fetchone()
:
def login():
db = sqlite3.connect("wtf.db")
while True:
username = input("Please enter your username: ")
password = input("Please enter your password: ")
cursor = db.cursor()
find_user = "SELECT * FROM user WHERE username=? AND password=?"
cursor.execute(find_user, [username, password])
result = cursor.fetchone()
if result:
name = result[1]
print("Welcome", name)
break
Я немного очистил код здесь;Я удалил использование диспетчера контекста with
, так как нет необходимости использовать его, когда не вносятся какие-либо изменения в базу данных, и есть только один SELECT
(управление транзакциями не требуется), и вышеперечисленное подключается к базе данных простоодин раз (повторное подключение для каждой попытки - пустая трата времени, изменения в базе данных из другого процесса автоматически все равно регистрируются).
Я также использовал name
вместо i[1]
, чтобы приветствовать вошедшего в систему пользователя.Хорошие имена переменных облегчают понимание кода.