数据库文件在执行一个语句后关闭,并显示类型错误:'NoneType'对象不可下标



我从其他帖子中了解到,有了这个错误,我无法分配一个不存在的值。但我想知道为什么sqlite/python在我试图通过条件时会这样做:

1 import sqlite3
2 
3 conn = sqlite3.connect("users.db")
4 
5 username = input("Username: ")
6 
7 rows = conn.execute("SELECT * FROM users WHERE username LIKE :username", [username])
8 
9 print(len(rows.fetchall()))
10 
11 pwhash = rows.fetchone()[2]
12 print(pwhash)
13                                                                                                                      

如果我执行上面的代码并输入Alice/Alice(存在于数据库中(,我会得到:

username: alice
1
pwhash = rows.fetchone()[2]
TypeError: 'NoneType' object is not subscriptable

现在,如果我用len(rows.fetchall(((语句在pwhash和print(pwhash(之间交换位置,我会得到:

username:alice
pbkdf2:sha256:150000$aZgmxaja$5a6f6cec4cac11ba7d330a69c5f2f7f198172c27a12a75c96abe61d04e213e51                                                         
0

输出将成功显示Alice的密码哈希值,但将print(len(rows.fetchall((((显示为0(就好像它没有找到一秒钟前找到的行一样(,而不是1。在我看来,db文件在执行一条语句后关闭,导致其余变量无法从数据库中获取值。

所需结果:

username:alice
1
pbkdf2:sha256:150000$aZgmxaja$5a6f6cec4cac11ba7d330a69c5f2f7f198172c27a12a75c96abe61d04e213e51                                                         

用解决

1 import sqlite3
2 
3 conn = sqlite3.connect("users.db")
4 
5 username = input("Username: ")
6 
7 rows = conn.execute("SELECT * FROM users WHERE username LIKE :username", [username]).fetchall()
8 
9 pwhash = rows[0][2]
10 
11 print(len(rows)
12 print(pwhash)
13    

最终得到:

username:alice
1
pbkdf2:sha256:150000$aZgmxaja$5a6f6cec4cac11ba7d330a69c5f2f7f198172c27a12a75c96abe61d04e213e51

原因是:一个接一个地调用fetch函数会导致试图获取下一个不存在的行。

相关内容

最新更新