SQLAlchemy Join从多个表中检索数据

时间:2018-05-14 08:32:11

标签: python mysql sqlalchemy

我正在尝试使用 .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)

2 个答案:

答案 0 :(得分:0)

看一下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的成员)。然后,只要从数据库中查询用户(或用户组),就可以访问UserGroup的属性:

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

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

也可以进行反向访问;如果您只是查询UserGroup,则可以直接访问相应的成员(通过back_populates - 关键字参数):

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

答案 1 :(得分:0)

所以我似乎需要对查询使用不同的方法,并且它返回一个对象元组,然后我需要解析它。

有效的是:

 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的数据为[0],UserGroups为[1],而Area为[2]。然后,我可以使用 a [1] .group_name 等访问 group_name 列。

希望这有助于其他正在尝试使用此功能的人!