【问题标题】:How to print the result of an association table如何打印关联表的结果
【发布时间】:2020-08-01 17:28:18
【问题描述】:

我有一个用户和一个分支表,它有多对多的关系。因此我已经定义了关联表。

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 表有以下内容:

#   user_id branch_id
1   3   1
2   1   2
3   1   1
4   1   3
5   1   4

如何打印 user_branch_map 的结果而不是 ids 而是用户和分支表的连接结果。我能够打印分支表信息但我还需要用户信息。我尝试了以下方法:

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)

【问题讨论】:

    标签: python python-3.x flask flask-sqlalchemy flask-restful


    【解决方案1】:

    db.session.query(User.id,User.full_name,Branch.id ,Branch.name).filter(user_branch_map.c.user_id == User.id).filter(user_branch_map.c.branch_id == Branch .id)

    【讨论】:

      【解决方案2】:

      我猜你想获得每个用户的分支,所以像username, branchname 这样的东西应该允许你从那里扩展它。如果您将 User 模型定义为

      class User(db.Model):
        ...
        branches = db.relationship("Branch", secondary=user_branch_map, backref="users")
        ...
      

      那么您只需将User 加入到Branch,剩下的就交给 SQLAlchemy:

      q = q = db.session.query(User.username, Branch.branch_name).select_from(User).join(user_branch_map).join(Branch).all()
      

      这应该会生成以下 SQL:

      SELECT user.username, branch.branch_name
      FROM user
      JOIN user_branch_map ON user.id = user_id
      JOIN branch ON branch.id = branch_id
      

      然后使用backref="users" 还应该使Branch 上的users 属性可用(参见docs

      【讨论】:

      • 我收到此错误 sqlalchemy.exc.InvalidRequestError: Don't know how to join to <class 'app.Branch'>. Please use the .select_from() method to establish an explicit left side, as well as providing an explcit ON clause if not present already to help resolve the ambiguity.
      • 虽然我通过这样做得到了我的结果 maptable = db.session.query(User.id,User.full_name,Branch.id ,Branch.name).filter( user_branch_map.c.user_id == User.id).filter(user_branch_map.c.branch_id == Branch.id)
      • 所以你没有使用我在回答中提到的.join()?你有什么理由吗?
      • 我已经尝试了你的方法,我得到了上述错误。
      • 啊,我误会了。正如错误所说,您应该添加.select_from()q = db.session.query(User.username, Branch.branch_name).select_from(User).join(Branch).all(),这行得通吗?
      猜你喜欢
      • 1970-01-01
      • 2017-05-03
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      相关资源
      最近更新 更多