【问题标题】:Return query with columns from multiple tables in SQLAlchemy使用 SQLAlchemy 中多个表的列返回查询
【发布时间】:2016-05-07 20:56:09
【问题描述】:

我无法找到这个问题的答案,但我确信它一定在某个地方。 我的问题类似于这个问题:sqlalchemy: how to join several tables by one query?

但我需要一个查询结果,而不是一个元组。我无权访问模型,因此无法更改它,也无法修改函数以使用元组。

我有两个表,UserInformationMemberInformation,它们都有一个外键并与 Principal 有关系,但彼此之间没有关系。

如何在一个查询中从两个表中获取所有记录和列? 我试过了:

query = DBSession.query(MemberInformation).join(UserInformation, MemberInformation.pId == UserInformation.pId)

但它只返回 MemberInformation 的列

和:

query = DBSession.query(MemberInformation, UserInformation).join(UserInformation, MemberInformation.pId == UserInformation.pId)

但这会返回一个元组。

我在这里错过了什么?

【问题讨论】:

  • 您希望如何查看查询结果? .all() 怎么样 - 它会返回一个列表
  • 我知道,但我特别需要一个查询对象。我对其进行进一步的操作等
  • 查看答案stackoverflow.com/a/6045131/2372812 - 您可以在query() 部分中放置多个表格。
  • 例如使用query(table1, table2).filter(table1.thing == table2.other_thing)
  • 那个答案返回一个元组

标签: python sql sqlalchemy


【解决方案1】:

老问题,但值得回答,因为我看到它有很多观看活动。

您需要创建一个关系,然后告诉 SQLAlchemy 如何加载相关数据。不确定您的表/关系是什么样的,但它可能看起来像这样:

# Create relationship
MemberInformation.user = relationship(
    "UserInformation",
    foreign_keys=[MemberInformation.pId],
    lazy="joined",
)

# Execute query
query = DBSession.query(MemberInformation) \
    .options(joinedload(MemberInformation.user)) \
    .all()

# All objects are in memory. Evaluating the following will NOT result in additional
# database interaction
for member in query:
    print(f'Member: {member} User: {member.user}')

# member is a MemberInformation object, member.user is a UserInformation object

理想情况下,关系将在您的模型中定义。但是,如果可以在运行时定义,请列出上面的示例。

【讨论】:

    【解决方案2】:

    我发现这样做的唯一方法是使用语句而不是查询:

    stmt = select([table1, table2.col.label('table2_col')]).select_from(join(table1, table2, table1.t1_id == table2.t2_id))
    obj = session.execute(stmt).fetchall()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-18
      • 2019-08-16
      • 2020-02-17
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2020-10-26
      相关资源
      最近更新 更多