sqlalchemy连接从多个表检索数据

mbzjlibv  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(321)

我正在尝试使用.join()方法使用sqlalchemy从多个表中检索数据。
当我运行查询时,我希望返回一个对象,该对象将来自不同表的所有数据连接起来,这样我就可以使用.area\u名称,以此类推,其中area\u名称位于一个连接的表上。下面是我正在运行的查询和表布局,如果有人能提供如何实现我的目标行为的见解,我将不胜感激!我已经能够使用具有相同语法的.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()

还有table:

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)
rjee0c15

rjee0c151#

看看sqlalchemy的 relationship 功能:
http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-对很多人来说
您可能需要将新属性添加到 User 像这样的班级:

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

这将自动解决 User 以及 UserGroups (假设一个用户一次只能是一个用户组的成员)。然后,只要从数据库中查询一个用户(或一组用户),就可以访问用户组的属性:

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

sqlalchemy为您解析联接,查询时不需要显式联接外部表。
也可以反向访问;如果您只是查询一个用户组,您可以直接访问相应的成员(通过 back_populates -关键字参数):

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

3wabscal2#

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

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]。然后,我可以使用[1].group\u name等访问group\u name列。
希望这能帮助其他人谁正试图与此工作!

相关问题