为什么字符串不等于sqlite3数据库中的文本值(Python)

时间:2016-03-18 19:07:22

标签: python login tkinter sqlite

嗨我想在tkinter中创建一个简单的登录模块,因为我通过条目小部件从用户那里获取输入,并通过if循环将该密码与数据库中的密码进行比较...但由于某种原因,密码不匹配,所以我尝试了一些测试,并且它非常适合....

import sqlite3
conn=sqlite3.connect('auth_rWebsites.db')
c=conn.cursor()

def check_password(key):
    thePass= c.execute("SELECT pass FROM user_pass") 
    if key == thePass:
        print("right Password")
    else:
        print("Wrong Password")

rows= c.execute("SELECT * FROM user_pass")
for row in rows:

    print row

check_password("root")

这个上面简单的测试代码我写的.. 输出

(u'root',)
Wrong Password

所以有人请解释一下为什么会发生这种情况,我该怎么做才能匹配呢....

2 个答案:

答案 0 :(得分:3)

c.execute("SELECT pass FROM user_pass")返回一个元组,而不是字符串,但key是一个字符串。您需要从元组中获取第一个值并将其与key参数进行比较,因此请将函数更改为:

def check_password(key):
    thePass= c.execute("SELECT pass FROM user_pass")[0] # Changed here
    if key == thePass:
        print("right Password")
    else:
        print("Wrong Password")

答案 1 :(得分:2)

thePass是一个可复制的tuplekey是一个字符串。

通常,python db api总是将数据库行作为元组返回,因为您可以在语句中选择多个内容。而不是让需要查看查询的混淆逻辑来确定行的返回类型(对于数据库api和调用者),规范说只是总是返回一个元组。

您需要正确比较key行...

rows = c.execute("Select pass FROM user_pass")
for row in rows:
    if row[0] == thePass:
        print("right password")
        return
else:
    print("Wrong Password")    

注意,这可能不是你真正想要的。它所做的只是验证user_pass表中的一行是否具有pass值。更有可能的是,您希望根据用户名过滤查询,然后检查密码:

c.execute("SELECT pass FROM user_pass WHERE username = ?", username)
result = c.fetchone()  # username should be unique I assume :-)
if result[0] == salt_and_hash(key):
    print("Yeah!")
else:
    print("No!")