необработанный запрос django возвращает неупорядоченную позицию dict в соответствии с запросом select

#python #mysql #django

#python #mysql #django

Вопрос:

Например, у меня есть запрос select a, b, c, d from table . почему dict иногда возвращает [{‘b’: 2}, {‘a’: 1}, {‘d’: 4}] ….] и т.д. Я хочу, чтобы это [{‘a’: 1}, {‘b’: 2}, {‘c’: 3}, ….] в соответствии с позицией в запросе выбора.

 db.execute(query)
data = dictfetchall(db)
  
 def dictfetchall(cursor):
    # Return all rows from a cursor as a dict
    columns = [col[0] for col in cursor.description]
    return [
        dict(zip(columns, row))
        for row in cursor.fetchall()
    ]
  

Комментарии:

1. Какую версию Python вы используете?

2. версия python 3.5.2

Ответ №1:

Ключи Dicts не были упорядочены в Python до версии 3.6, где реализация dict в CPython сохраняет порядок вставки, а в Python 3.7 порядок dict стал официально гарантированным.

Поскольку вы используете Python 3.5, где ключи dict неупорядочены, типичной альтернативой является использование collections.OrderedDict вместо:

 from collections import OrderedDict

def dictfetchall(cursor):
    columns = [col[0] for col in cursor.description]
    return [
        OrderedDict(zip(columns, row))
        for row in cursor.fetchall()
    ]