我有一段代码正在检查用户是否在数据表中。我可以得到它来生成一个用户详细信息的列表,但我不能为我的生活弄清楚为什么它不会让我在用户名有效时产生问候语。
代码是:
import sqlite3
import itertools
conn = sqlite3.connect("student_test_db.sqlite")
c = conn.cursor()
## connects to the database
username = input("please enter your username")
username = (username,)
c.execute( 'SELECT fname,sname,username FROM students WHERE username =?', username )
user_check = c.fetchall()
print (user_check)
print (type(user_check))
if username in user_check:
print ("Welcome")
else:
print ("Wrong username")
我得到的是:
please enter your usernameBobF
[('Bob', 'Fleming', 'BobF')]
<class 'list'>
Wrong username
我无法理解为什么用户名明显与列表中的内容相匹配。我是新手用户,如果我真的很明显,请道歉!
答案 0 :(得分:2)
由于您的用户名可能是唯一的,因此请将c.fetchall()
更改为c.fetchone()
,这样可以为您提供所需的行,而不是仅包含一行的行列表。查看与fetch methods相关的sqlite3文档。
正如评论中所指出的,您应该删除重新分配username
变量username = (username,)
的行,并在(username,)
中直接使用c.execute()
。
答案 1 :(得分:1)
除了将fetchall()
更改为fetchone()
之外,问题是您将元组(username,)
分配给变量username
,它从Bob
更改为(Bob,)
},当您的代码检查变量username
在结果中时,它将使用元组(Bob,)
而不是Bob
。这就是代码始终打印Wrong username
的原因。您必须更改为新的变量名称username
,将代码更改为:
import sqlite3
import itertools
conn = sqlite3.connect("student_test_db.sqlite")
c = conn.cursor()
## connects to the database
username = input("please enter your username")
username_sql = (username,)
print username
c.execute( 'SELECT fname,sname,username FROM students WHERE username =?',username_sql)
user_check = c.fetchone()
print (user_check)
print (type(user_check))
if username in user_check:
print ("Welcome")
else:
print ("Wrong username")
conn.close()
输出:
please enter your username'Bob'
Bob
(u'BobF', u'Fleming', u'Bob')
<type 'tuple'>
Welcome
答案 2 :(得分:-1)
解决了! 当我更改用户名变量以便在查询中使用时,我在其后添加了“,”。这就是它没有在列表中找到用户的原因。我在查询中为用户名添加了一个单独的变量,并且一切正常。 感谢您的所有建议。