我正在尝试使用.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)
2条答案
按热度按时间rjee0c151#
看看sqlalchemy的
relationship
功能:http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-对很多人来说
您可能需要将新属性添加到
User
像这样的班级:这将自动解决
User
以及UserGroups
(假设一个用户一次只能是一个用户组的成员)。然后,只要从数据库中查询一个用户(或一组用户),就可以访问用户组的属性:sqlalchemy为您解析联接,查询时不需要显式联接外部表。
也可以反向访问;如果您只是查询一个用户组,您可以直接访问相应的成员(通过
back_populates
-关键字参数):3wabscal2#
因此,似乎我需要使用不同的方法来进行查询,它返回一个对象元组,然后我需要对其进行解析。
有效的方法是:
其余的保持不变。然后返回一个元组,我可以解析其中的数据,其中user是a[0],usergroups是a[1],areas是a[2]。然后,我可以使用[1].group\u name等访问group\u name列。
希望这能帮助其他人谁正试图与此工作!