【问题标题】:SQLAlchemy: Map column name to value automaticallySQLAlchemy:自动将列名映射到值
【发布时间】:2017-08-15 18:39:54
【问题描述】:

背景

当我想创建一个字典来将列名映射到结果中的值时,我需要单独列出每一列

    result = self.session.query(Project)\
                .join(Deadline)\
                .values(Project.project_id, Project.project_name,
                    Project.project_root, Deadline.deadline_time)

    output = []
    for row in result:
        r = {}
        r['project_id'] = row.project_id
        r['project_name'] = row.project_name
        r['project_root'] = row.project_root
        r['deadline_time'] = row.deadline_time
        output.append(r)

    return output

模型是 ORM 映射的,不是 SQLAlchemy 核心。

class Deadline(Base):
    __tablename__ = 'deadline'

    deadline_id = Column(Integer, primary_key = True)
    deadline_time = Column(String, nullable = False)


class Project(Base):
    __tablename__ = 'project'

    project_id = Column(Integer, primary_key = True)
    project_name = Column(String, nullable = False)
    project_root = Column(String, nullable = False)
    deadline_id = Column(Integer, ForeignKey("deadline.deadline_id"), nullable=False)
    deadline = relationship("Deadline", primaryjoin = "Project.deadline_id == Deadline.deadline_id", backref=backref("project", uselist=False))

问题

这对于包含许多列的表来说效率不高,我也不能对其他表重复使用相同的代码。

我尝试了以下但无法获取列名

    column_names = [c["name"] for c in result.column_descriptions]
    return [dict(zip(column_names, row)) for row in result.all()]
    result.__table__.columns.keys() 

编辑 1

关于converting SQLAlchemy result into dict 有几个类似的问题。根据上面的代码,result.__table__.columns.keys() 不适用于 ORM 映射模型。

【问题讨论】:

标签: python orm sqlalchemy flask-sqlalchemy


【解决方案1】:

您的行是 SQLAlchemy KeyedTuple。由于 0.8 KeyedTuples 有 _asdict() 方法 - 你可以简单地使用:

output = []

for row in result:
    output.append(row._asdict())

PS。您不必在截止日期关系中指定这样一个微不足道的primaryjoin。 SQLAlchemy 将自行确定外键。

【讨论】:

    【解决方案2】:

    我相信你可以只使用字典理解:

    r = {k: row[k] for k in row}
    

    要将其包含在列表推导中的输出中:

    output = [{k: row[k] for k in row} for row in result]
    

    您可能只想将值附加到列表中,而不是在每行 JSON 样式中重复列名。

    【讨论】:

      【解决方案3】:

      krassowskianswer is exactly what I need。为简洁起见,我将_asdict() 应用为 lambda 函数。

      result = self.session.query(Project)\
                      .join(Deadline)\
                      .values(Project.project_id, Project.project_name,
                          Project.project_root, Deadline.deadline_time)
      map(lambda x: x._asdict(), result)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多