You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用Python中SQLite查询返回的results变量验证用户权限,实现仅管理员可添加商品的功能

实现权限校验的解决方案

当然可以!你的思路完全可行,咱们直接利用results变量就能完成权限判断。先帮你理清楚results的结构:fetchall()会返回一个元组列表——如果用户名和密码匹配,列表里会有一个元组(对应Users表中该用户的整行数据);如果不匹配,列表就是空的。

接下来分两步实现权限校验:

1. 基础实现(基于索引定位字段)

假设你的Users表字段顺序是:ID, Username, Password, userPermissionLevel(如果你的字段顺序不同,调整索引即可),可以这样写判断逻辑:

existingAccount = input("Do you already have an account? (y/n)")
if existingAccount == "y":
    username = input("Please enter your username: ")
    password = input("Please enter your password:")
    find_user = ("SELECT * FROM Users WHERE Username = ? AND Password = ?")
    c.execute(find_user, (username, password))
    results = c.fetchall()

    # 先判断用户是否登录成功(即账号密码匹配)
    if results:
        # 从结果中提取权限等级:results[0]是唯一的用户元组,索引3对应userPermissionLevel字段
        user_permission = results[0][3]
        # 校验权限(用lower()避免大小写敏感问题)
        if user_permission.strip().lower() == "admin":
            # 执行添加新商品的函数
            add_new_product()
        else:
            print("permission level inadequate")
    else:
        print("Invalid username or password")

2. 更健壮的实现(基于字段名定位)

如果担心后续表结构调整(比如字段顺序变化)导致索引失效,建议改用字典游标,这样可以直接通过字段名获取权限值,可读性和维护性更好:

# 初始化连接时指定字典游标
conn = sqlite3.connect('your_database.db')
c = conn.cursor(cursor_factory=sqlite3.Row)  # 使用字典游标

existingAccount = input("Do you already have an account? (y/n)")
if existingAccount == "y":
    username = input("Please enter your username: ")
    password = input("Please enter your password:")
    find_user = ("SELECT * FROM Users WHERE Username = ? AND Password = ?")
    c.execute(find_user, (username, password))
    result = c.fetchone()  # 因为账号密码唯一,用fetchone()比fetchall()更高效

    if result:
        # 直接通过字段名获取权限等级
        user_permission = result["userPermissionLevel"]
        if user_permission.strip().lower() == "admin":
            add_new_product()
        else:
            print("permission level inadequate")
    else:
        print("Invalid username or password")

额外提示

  • 用fetchone()替代fetchall():因为用户名+密码的组合是唯一的,不可能返回多行结果,fetchone()更高效,代码也更简洁。
  • 大小写处理:用lower()把权限值转为小写再判断,避免因为存储的是Admin/ADMIN导致校验失败。
  • 空格处理:strip()可以去掉权限值前后的空格,避免数据库中存储的权限值带空格导致判断错误。

内容的提问来源于stack exchange,提问作者SourOddity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 03:57:43