首页 > 解决方案 > python sqlite3没有打破

问题描述

我正在尝试使用 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()

标签: pythonsqlite

解决方案


你的 break 永远不会执行,因为 Python无法到达那里。首先,您的while循环缩进不同:

while True:
    # do things

if results is True:
    # loop with break

break 不能跳出while True循环,因为它不是循环的一部分

您必须先调整缩进:

while True:
    # do things

    if results:
        # loop with break

接下来测试是否results与对象相同True

if results is True:
    # ...

永远不会是真的,因为cursor.fetchall()总会产生一个列表。如果要测试列表是否为空,只需使用:

if results:
    # ...

if语句已经检查了某事是否为真,并且您几乎不需要在 Python中使用is Trueor 。== True

接下来,您breakfor循环中使用,因此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]欢迎登录用户。好的变量名有助于使代码更容易理解。


推荐阅读