我从其他帖子中了解到,有了这个错误,我无法分配一个不存在的值。但我想知道为什么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函数会导致试图获取下一个不存在的行。