Python и PYODB C. Я не могу прочитать результаты в подходящем словаре - PullRequest
0 голосов
/ 04 августа 2020

Кажется, я не могу прочитать результаты в словаре. Он продолжает выдавать мне результаты в виде списка, а не словаря.

Вот мой код:

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 все время говорит мне, что я смотрю список. Глядя на values ​​() или items (), я получаю сообщение об ошибке, что объект списка не имеет атрибутов 'values' AttributeError: 'list' object has no attribute 'values'

Более того, как я могу получить мои результаты, чтобы быть фактическим порядковым номером ключ productID? Что-то вроде:

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

Я пробовал другие способы получить это, но все еще получаю список, а не настоящий словарь. Я пробовал:

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

1 Ответ

1 голос
/ 04 августа 2020

Вы возвращаете results как новый список, потому что вы используете понимание списка. Вместо этого вы должны попробовать использовать что-то вроде понимания dict или даже просто создать dict вручную, используя для l oop:

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')]
...