питон sqlite3 не ломается - PullRequest
       1

питон sqlite3 не ломается

0 голосов
/ 21 октября 2018

Я пытаюсь создать журнал, используя sqlite3, и я следую учебному пособию YouTube.

Но когда я запускаю этот код, он не ломается и продолжает работать:

import sqlite3
import sys

def login():
    while True:
        username = input("Please enter your username: ")
        password = input("Please enter your password: ")
        with sqlite3.connect("wtf.db") as db:
            cursor = db.cursor()
        find_user = ("SELECT * FROM user WHERE username=? AND password=?")
        cursor.execute(find_user, [(username), (password)])
        results = cursor.fetchall()

    if results is True:
        for i in results:
            print("Welcome "+i[1])
            break


    else:
        print("Username and password not reconized or registered")
        again = input("Do you want to try again?(y/n) ")
        if again.lower() == "n":
            print("bye")
            sys.exit()

login()

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Я вижу много проблем с этим, основная проблема заключается в этом разделе кода

 while True:
        username = input("Please enter your username: ")
        password = input("Please enter your password: ")
        with sqlite3.connect("wtf.db") as db:
            cursor = db.cursor()
        find_user = ("SELECT * FROM user WHERE username=? AND password=?")
        cursor.execute(find_user, [(username), (password)])
        results = cursor.fetchall()

if results is True:
    for i in results:
        print("Welcome "+i[1])
        break

Ваше условие if находится на том же уровне, что и условие while, означающее, что оно будет работать после разрывов цикла, норазрыв цикла зависит от условия if, исправьте отступ, и не должно быть проблем

во-вторых, вместо cursor.fetchall() просто сделайте cursor.fetchone()

в-третьих вместо if results is True: просто сделайте`если результаты не None:

0 голосов
/ 21 октября 2018

Ваш перерыв никогда не выполняется, потому что 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], чтобы приветствовать вошедшего в систему пользователя.Хорошие имена переменных облегчают понимание кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...