python - 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()
解决方案
你的 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 True
or 。== True
接下来,您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]
欢迎登录用户。好的变量名有助于使代码更容易理解。
推荐阅读
- html - CSS Grid - 将项目移动到网格正方形的底部
- c++ - 为什么我的基因 AI 无法解决 XOR 问题?
- flutter - 测试 WebView
- java - 设置对象数组
- python - pyinstaller 安装成功后不识别为内部或外部命令错误
- python - 如何在python中使用api为bloomberg bdh查询添加选项
- css - 使用 boostrap 5 网格系统的 ruby rails 预编译错误
- javascript - Dart“加密”库在加密后给出不可读的字符串
- javascript - 未处理的拒绝(TypeError):props.places.map 不是函数
- php - 1067 即使从 sql_mode 中删除 NO_ZERO_DATE 和 NO_ZERO_IN_DATE 值,Laravel 中日期 0000-00-00 00:00:00 的默认值也无效