首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从多个表中检索数据的SQLAlchemy连接

从多个表中检索数据的SQLAlchemy连接
EN

Stack Overflow用户
提问于 2018-05-14 08:32:11
回答 2查看 13.7K关注 0票数 7

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

当我运行查询时,我希望得到一个对象,它将来自不同表的所有数据连接起来,这样我就可以使用、a.area_name、等等,其中area_name位于一个已连接的表上。下面是我正在运行的查询和表布局,如果有人能够提供关于如何实现我的目标行为的洞察力,我将非常感激!我已经能够使用具有相同语法的.join()方法来匹配和返回结果,我估计它也会从行返回额外的数据,因为加入了表(也许我误解了该方法如何工作,或者如何通过查询对象检索信息?)。

如果它对故障排除有帮助,我将使用MySQL作为数据库

查询:

代码语言:javascript
运行
复制
a = User.query.filter(User.user_id==1).join(UserGroup,
 User.usergroup==UserGroup.group_id).join(Areas, User.area==Areas.area_id).first()

各表:

代码语言:javascript
运行
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-14 08:59:49

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

起作用的是:

代码语言:javascript
运行
复制
 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()

其余的都没变。然后返回一个元组,我可以解析来自用户的数据是a,来自UserGroups是a1,区域是a2。然后,我可以使用group_name列访问、a1.group_name、等。

希望这能帮助其他人处理这个问题!

票数 4
EN

Stack Overflow用户

发布于 2018-05-14 08:45:22

看看SQLAlchemy的relationship函数:

relationships.html#one-to-many

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

代码语言:javascript
运行
复制
group = sqlalchemy.relationship('UserGroups', back_populates='users')

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

代码语言:javascript
运行
复制
a = User.query.filter(...).first()
print(a.group.group_name)

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

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

代码语言:javascript
运行
复制
g = UserGroup.query.filter(...).first()
for u in g.users:
    print(u.name)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50326052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档