【问题标题】:SQLAlchemy _asdict() method returns only one columnSQLAlchemy _asdict() 方法只返回一列
【发布时间】:2019-01-19 17:35:16
【问题描述】:

我正在尝试将 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)'}

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您尚未命名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'}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      • 2012-04-24
      • 1970-01-01
      相关资源
      最近更新 更多