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

Posted

技术标签:

【中文标题】为啥字符串不等于 sqlite3 数据库中的文本值(Python)【英文标题】:Why does not the string equal to a text value in sqlite3 database (Python)为什么字符串不等于 sqlite3 数据库中的文本值(Python) 【发布时间】:2016-07-05 16:26:19 【问题描述】:

嗨,我正在尝试在 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

所以请有人解释一下为什么会发生这种情况以及我必须做些什么来匹配它......

【问题讨论】:

【参考方案1】:

thePass 是一个产生tuples 的可迭代对象,key 是一个字符串。

通常,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!")

【讨论】:

【参考方案2】:

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")

【讨论】:

我不相信这是正确的......c.execute 不会返回一个产生元组的迭代吗?

以上是关于为啥字符串不等于 sqlite3 数据库中的文本值(Python)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 sqlite3_prepare_v2 == FALSE?

SQl2008中主键不能等于NULL,可是可以等于null,这是为啥。

SQLite3笔记

为啥 1**Inf 的值等于 1,而不是 NaN?

为啥多维数组的枚举值不等于自身?

sqlite3数据库基本操作命令大全