SQLite3 记录验证

SQLite3 record validation

我希望我的代码使用 if 语句来检查用户属于哪个用户组,然后为每个用户调用不同的函数。我现在的代码如下:

c.execute('SELECT * from users WHERE username=? AND password =?',
              (username_input, password_input))
    if c.fetchone() is not None:
        c.execute('SELECT usergroup from users WHERE username=? AND password=?',
                               (username_input, password_input))
        user_group = c.fetchone()
        for (usergroup,) in c:
            if user_group == 1:
                App.admin_login_successful(self)
            elif user_group == 2:
                App.user_login_successful(self)
            else:
                App.user_login_successful(self)
                # This shouldn't happen, as all records should theoretically contain a value for usergroup.

我应该怎么做才能进行比较,因为我的记录确实包含 1 或 2 的值,但验证不起作用。

不要多次重复相同的 sql 查询。

funcmap = {1: self.admin_login_successful, 2: self.user_login_successful}
c.execute('SELECT usergroup from users WHERE username=? AND password=?',
          (username_input, password_input))
for (usergroup,) in c:
    funcmap[usergroup]()

如果查询returns没有usergroups,那么for-loop就不会 执行它的body。如果 usergroup 不是 1 或 2,则 funcmap[usergroup] 将引发 KeyError。正如你所说,这 不应该发生,但如果发生了 KeyError 会让你 知道。您可能希望使用 try..except KeyError 语句 funcmap[usergroup]() 以其他方式处理错误(记录、退出前更好的特定错误消息等)

请注意,根据您如何实例化 sqlite3 连接以及您如何设置数据库 table,usergroup 可能是整数或字符串。如果它返回一个字符串,您可能想问另一个关于如何将 usergroup 检索为整数的问题。 或者,您可以更改 funcmap 以期望字符串作为字典键:

funcmap = {'1': self.admin_login_successful, '2': self.user_login_successful}