使用 SQLAlchemy 中多个表中的列返回查询

Nie*_*iel 6 python sql sqlalchemy

我一直无法找到答案,但我确定它一定在某个地方。我的问题类似于这个问题:sqlalchemy:如何通过一个查询连接多个表?

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

我有两个表,UserInformationMemberInformation,都有一个外键和关系到Principal,但不是彼此。

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

query = DBSession.query(MemberInformation).join(UserInformation, MemberInformation.pId == UserInformation.pId)
Run Code Online (Sandbox Code Playgroud)

但它只返回 MemberInformation 的列

和:

query = DBSession.query(MemberInformation, UserInformation).join(UserInformation, MemberInformation.pId == UserInformation.pId)
Run Code Online (Sandbox Code Playgroud)

但这会返回一个元组。

我在这里缺少什么?

Mat*_*ham 6

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

您需要创建一个关系,然后告诉 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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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