Python 如何打印关联表的结果
我有一个用户和一个分支表,它有多对多关系,因此我定义了一个关联表Python 如何打印关联表的结果,python,python-3.x,flask,flask-sqlalchemy,flask-restful,Python,Python 3.x,Flask,Flask Sqlalchemy,Flask Restful,我有一个用户和一个分支表,它有多对多关系,因此我定义了一个关联表 user_branch_map = db.Table( 'user_branch_map', db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True), db.Column('branch_id', db.Integer, db.ForeignKey('branch.id'), primary_key=True)
user_branch_map = db.Table(
'user_branch_map',
db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
db.Column('branch_id', db.Integer, db.ForeignKey('branch.id'), primary_key=True)
)
用户分支映射表包含以下内容:
# user_id branch_id
1 3 1
2 1 2
3 1 1
4 1 3
5 1 4
我如何打印用户\分支\映射的结果不是ID而是用户和分支表的联接结果。我可以打印分支表信息,但我还需要用户信息。我尝试过以下方法:
def get(self):
# maptable= User.query.join(user_branch_map).join(Branch). \
# filter((user_branch_map.c.user_id == User.id) & (user_branch_map.c.branch_id == Branch.id)).all()
# print(type(maptable))
# # maptable = db.session.query(user_branch_map).join(User).all()
# # print(maptable)
# for row in maptable:
# print(row)
# branches = db.session.query(Branch).all()
# q = db.session.query(User).options(eagerload(User.branches))
# for u in q.all():
# for c in branches:
# print (c.id, c.name,(c in u.branches))
q = db.session.query(user_branch_map).join(Branch).join(User).all()
print(q)
我猜您希望获得每个用户的分支,因此类似于
username,branchname
的东西应该允许您从那里扩展它。如果将用户模型定义为
类用户(db.Model):
...
Branchs=db.relationship(“Branch”,secondary=user\u Branch\u map,backref=“users”)
...
然后您只需将用户
加入到分支
,SQLAlchemy将完成其余工作:
q=q=db.session.query(User.username,Branch.Branch\u name)。从(User)中选择。加入(User\u Branch\u map)。加入(Branch).all()
这将生成以下SQL:
选择user.username、branch.branch\u name
来自用户
在user.id=user\u id上加入用户\u分支\u映射
在branch.id=branch\u id上加入分支
然后使用
backref=“users”
还应该使Branch
上的users
属性可用(参见)db.session.query(User.id,User.full\u name,Branch.id,Branch.name)。过滤器(User\u Branch\u map.c.User\u id==User.id)。过滤器(User\u Branch\u map.c.Branch\u id==Branch.id)我收到此错误sqlalchemy.exc.InvalidRequestError:不知道如何加入。请使用.select\u from()方法建立一个显式的左侧,如果尚未出现,请提供一个explcit ON子句来帮助解决歧义。
尽管我是通过这样做得到结果的maptable=db.session.query(User.id,User.full\u name,Branch.id,Branch.name).filter(user\u branch\u map.c.user\u id==user.id)。filter(user\u branch\u map.c.branch\u id==branch.id)
所以你没有使用我在回答中提到的.join()
?你有什么原因吗?我试过你的方法,我得到了上面的错误。啊,我误解了。正如错误所说,您应该添加。选择\u from()
q=db.session.query(User.username,Branch.Branch\u name)。从(User.join(Branch.all())中选择\u,是否有效?