Метод SQLAlchemy _asdict () возвращает только один столбец - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь преобразовать строки, возвращенные в запросе SQLAlchemy, в словари.Когда я пытаюсь использовать метод ._asdict (), я получаю только пару ключ-значение для первого столбца в моих результатах.

Есть ли что-то еще, что я должен сделать, чтобы создать пару ключ-значение в словаре для всех столбцов в строке результатов?

class Project(db.Model):

    __tablename__ = 'entries'

    id = db.Column(db.Integer, primary_key=True)
    time_start = db.Column(db.DateTime(timezone=False))
    time_end = db.Column(db.DateTime(timezone=False))
    name = db.Column(db.String(256), nullable=True)
    analyst = db.Column(db.String(256), nullable=True)

    def __init__(id, time_start, time_end, project_name, analyst):
        self.id = id
        self.time_start = time_start
        self.time_end = time_end
        self.name = name
        self.analyst = analyst

latest_projects = db.session.query((func.max(Project.time_end)), Project.analyst).group_by(Project.analyst)

for row in latest_projects.all():
    print (row._asdict())

{'analyst': 'Bob'}
{'analyst': 'Jane'}
{'analyst': 'Fred'}

Я ожидал увидеть такие результаты ...

{'analyst': 'Bob', 'time_end': '(2018, 11, 21, 14, 55)'}
{'analyst': 'Jane', 'time_end': '(2017, 10, 21, 08, 00)'}
{'analyst': 'Fred', 'time_end': '(2016, 09, 06, 01, 35)'}

1 Ответ

0 голосов
/ 19 января 2019

Вы не назвали столбец func.max(), поэтому нет имени для использования в качестве ключа в результирующем словаре. Столбцы функции агрегирования не называются автоматически даже при объединении одного столбца; то, что вы основали этот столбец на столбце time_end, здесь не имеет значения.

Дайте этому столбцу метку:

latest_projects = db.session.query(
    func.max(Project.time_end).label('time_end'),
    Project.analyst
).group_by(Project.analyst)

Демо-версия:

>>> latest_projects = db.session.query(
...     func.max(Project.time_end).label('time_end'),
...     Project.analyst
... ).group_by(Project.analyst)
>>> for row in latest_projects.all():
...     print (row._asdict())
...
{'time_end': datetime.datetime(2018, 11, 21, 14, 55), 'analyst': 'Bob'}
{'time_end': datetime.datetime(2016, 9, 6, 1, 35), 'analyst': 'Fred'}
{'time_end': datetime.datetime(2017, 10, 21, 8, 0), 'analyst': 'Jane'}
...