首页 > 解决方案 > 在 WHERE 子句中使用占位符查询记录是否存在

问题描述

我正在编写一个登录 python 脚本来验证用户帐户是否存在于 SQLite 数据库中。如何在我的 sql 语句中插入占位符,以根据数据库表中存在的记录验证用户输入?或者如果数据库很大,我可以在不使用 for 循环的情况下应用什么其他替代方案,这可能会很慢?

使用 python3 作为我的基本代码并为数据库集成 Sqlite,我尝试在用户输入后使用 EXISTS 子句,方法是为代表用户输入的值包含占位符。Exists 子句通常返回我已分配给变量的 1(True) 或 0(False),因此如果针对“IF 选择器”进行检查,则应验证“Log”表中是否存在帐户记录。

            print('Logging into an existing account...')
            try:
                self.user = input('Enter user name: ')
                self.pas = input('Enter password: ')
                self.log = (self.user,self.pas)
                self.sql = '''SELECT EXISTS (SELECT 1 FROM Log WHERE 
                Name=? AND Password=?);'''
                self.cur.execute('SELECT * FROM Log;')             
                self.val = self.cur.execute(self.sql,self.log)
                if self.val == 1:
                    print(f'\nLogged in as {self.user}')
                    time.sleep(2)
                else:
                    print('\nAccount is non-existent!')
                    time.sleep(2)

预期结果:根据 EXISTS 子句存在的用户记录应始终返回 1,如果由“IF 选择器”验证,则应为“真”,因此输出“以(用户)身份登录”。

实际结果:尽管数据库表中存在用户记录且没有错误,但输出为“帐户不存在”。

标签: pythonsqlite

解决方案


execute() 解析 SQL 语句和一个元组。在我的例子中,元组包含我的变量。因此,我只需要使用 fetchone() 获取 execute() 函数返回的值。假设返回的值必须是一个包含整数的行,我将其分配给变量并应用索引来确定实际值。在使用 IF 进行测试时,我得到了预期的结果!

                self.sql = '''SELECT EXISTS (SELECT 1 FROM Log WHERE Name=? AND 
                Password=?);'''
                self.cur.execute(self.sql,self.log)
                self.val = self.cur.fetchone()
                if self.val[0]==1:
                    time.sleep(1)
                    print(f'\nLogged in as {self.user}\n')

推荐阅读