首页 > 解决方案 > Python 和 PYODBC。我无法将结果读取到正确的字典中

问题描述

我似乎无法将结果读入字典。它不断地将结果作为列表而不是字典给我。

这是我的代码:

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password)
cursor = cnxn.cursor()    

# Sample select query
cursor.execute("SELECT TOP 500 [OrderNumber], [ProductID] FROM [dbo].[Results]")    

columns = [column[0] for column in cursor.description]    

results = [dict(zip(columns, row)) for row in cursor.fetchall()]    

for x in results.values():
    print(x)

它给了我一个列表,而不是字典。这就是我得到的:

[{'OrderNumber': '123456789', 'ProductID': '11111111'}, {'OrderNumber': '234567891', 'ProductID': '222222'}

它不是我需要的字典。我试着像字典一样阅读它,而 Python 一直告诉我我正在查看一个列表。查看值()或项目(),它给了我一个错误,列表对象没有属性“值”AttributeError: 'list' object has no attribute 'values'

此外,我怎样才能让我的结果成为实际订单号作为 productID 的键?就像是:

{"123456789":"11111111", "234567891":"22222222"}

我确实尝试了其他方法来获取它,但我仍然得到一个列表,而不是真正的字典。我试过了:

    for row in cursor.fetchall():
        results.append(dict(zip(columns,row)))

标签: pythondictionarypyodbc

解决方案


您将results作为新列表返回,因为您使用的是列表理解。您应该尝试使用类似 dict comprehension 的东西,或者甚至只是使用 for 循环手动创建一个 dict:

results = {k:v for (row[columns.index('OrderNumber')], row[columns.index('ProductID')]) in cursor.fetchall()}

或更简单地说:(因为我们已经知道这些列中的每一个都有这些索引

 results = {k:v for (row[0], row[1]) in cursor.fetchall()}

这与运行相同:

columns = [column[0] for column in cursor.description] 
results = {} 
for row in cursor.fetchall():
    results[row[0]] = row[1]  # short version
    # or use this instead if you have a lot of columns and don't remember index
    results[row[columns.index('OrderNumber')]] = row[columns.index('ProductID')]

推荐阅读