【问题标题】:How can I create a multi-value dictionary?如何创建多值字典?
【发布时间】:2021-07-23 15:18:28
【问题描述】:

我有来自 SQL Server 的用户信息 - 用户名和密码 - 现在我想创建一个字典

{ID : password}

但如果我有多个,它只会保存我放入的最后一个

for i in (cursor.execute('select * from Person')):
    idNameDict = {i[0]:i[3]}

我想这样做,这样我可以更容易地检查基于 ID 输入的密码是否正确,因为现在看起来很长

def logIn(userName,userPassword):
    userID=[]
    global p
    lbl = Label(root)
    lbl.grid(row=5,column=1)
    for user in (cursor.execute('select * from Person')):
        p = Person(user[0],user[1],user[2],user[3])
        userID.append(p)
    for id in userID:
        if userName == id.ID:
            if userPassword == id.password:
                userPage(root,userName)
            else:
                lbl.config(text= "Invalid Password")
        else:
            lbl.config(text= "Invalid User Name")

【问题讨论】:

  • 为什么每次都取整个表?只需执行cursor.execute("SELECT * FROM Person WHERE ID=?", (id,))。这样就不需要循环了,你减少了网络流量。
  • 我真诚地希望您不打算在任何生产系统中以纯文本形式存储密码。
  • 暂时不,我只是在构建一个宠物项目。所以它不会用于大众市场或任何只为我自己的东西
  • 我只是不确定,如果最佳做法是从 SQL 中提取所有信息,然后将其放在一个类中并解决这个问题,或者只是从 SQL 中提取数据
  • 每次调用只需要一个用户名。具体来说,这段代码没有缓存任何东西。它正在为每次通话读取整个表格。更好地阅读您需要的一个名字。

标签: python sql-server project


【解决方案1】:

您当前的代码无法正常工作,因为您在每次迭代中都从头开始声明字典。您需要通过以下方式进行:

idNameDict = {}
for i in (cursor.execute('select * from Person')):
    idNameDict[i[0]] = i[3]

【讨论】:

  • 是的,我知道这只是从头开始声明。你能解释一下为什么会这样吗?
  • 如果从头开始声明字典,那么之前的所有数据都会丢失,只保留最后一项。在我的代码中,字典仅在开头声明,然后将所有项目添加到循环中并保存在字典中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2021-12-04
  • 2021-05-01
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
相关资源
最近更新 更多