繁体   English   中英

SQLAlchemy Join从多个表中检索数据

[英]SQLAlchemy Join to retrieve data from multiple tables

我正在尝试使用.join()方法使用SQLAlchemy从多个表中检索数据。

当我运行查询时,我期望返回一个对象,该对象具有来自不同表的所有数据,因此我可以使用a.area_name ,依此类推,其中area_name在所连接的表之一上。 下面是我正在运行的查询和表布局,如果有人可以提供深入了解如何实现我想要的行为,我将不胜感激! 我已经能够使用具有相同语法的.join()方法来匹配结果并返回它们,我发现它也会从行中返回额外的数据,因为它会联接表(也许我误解了方法有效或如何通过查询对象检索信息?)。

如果它有助于故障排除,我正在使用MySQL作为数据库

查询:

a = User.query.filter(User.user_id==1).join(UserGroup,
 User.usergroup==UserGroup.group_id).join(Areas, User.area==Areas.area_id).first()

和表:

class User(db.Model):
    user_id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), unique=True)
    usergroup = db.Column(db.Integer, db.ForeignKey('user_group.group_id'), nullable=False)
    area = db.Column(db.Integer, db.ForeignKey('areas.area_id'), nullable=False)

class UserGroups(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    group_id = db.Column(db.Integer, nullable=False, unique=True)
    group_name = db.Column(db.String(64), nullable=False, unique=True)


class Areas(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    area_id = db.Column(db.Integer, nullable=False, unique=True)
    area_name = db.Column(db.String(64), nullable=False, unique=True)

看一下SQLAlchemy的relationship函数:

http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-many

您可能想要向您的User类添加一个新属性,如下所示:

group = sqlalchemy.relationship('UserGroups', back_populates='users')

这将自动地解决之间的一对多的关系UserUserGroups (假设用户只能有一个用户组的成员在一个时间)。 然后,从数据库中查询一个用户(或一组用户)后,您就可以简单地访问UserGroup的属性:

a = User.query.filter(...).first()
print(a.group.group_name)

SQLAlchemy为您解析联接,您在查询时不需要显式联接外部表。

反向访问也是可能的。 如果仅查询UserGroup,则可以直接访问相应的成员(通过back_populates -keyword参数):

g = UserGroup.query.filter(...).first()
for u in g.users:
    print(u.name)

因此,似乎我需要对查询使用不同的方法,并且它返回一个元组,然后我需要对其进行解析。

起作用的是:

 a = db.session.query(User, UserGroups, Areas
 ).filter(User.user_id==1
 ).join(UserGroup,User.usergroup==UserGroup.group_id
 ).join(Areas, User.area==Areas.area_id
 ).first()

其余的保持不变。 然后返回一个元组,我可以解析其中来自User的数据是a [0],来自UserGroups的数据是a [1],而Areas是a [2]。 然后,我可以使用a [1] .group_name等访问group_name列。

希望这可以帮助尝试此操作的其他人!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM