繁体   English   中英

左加入(flask)sqlalchemy,获取不匹配的值并在右表上进行过滤

[英]Left join in (flask)sqlalchemy with getting unmatched values and filter on the right table

我想获得所有作业的列表,结果集中还包含用户的进度(UserAssignments 表)。 这意味着在 assignments 和 userassignments 表之间应该有一个连接(其中 assignmentid 是相等的),而且还有一个过滤器来检查进度是否来自当前用户。 下面列出了数据库的图表和实际模型。

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20), index=True, unique=True, nullable=False)
    password_hash = db.Column(db.String(128), nullable=False)
    roleid = db.Column(db.Integer, db.ForeignKey('role.roleid'), nullable=False)
    groups = db.relationship('Group', secondary=users_groups, lazy='dynamic')
    assignments = db.relationship('Assignment', secondary=users_assignments, lazy='dynamic')

class Assignment(db.Model):
    assignmentid = db.Column(db.Integer, primary_key=True)
    assignmentname = db.Column(db.String(128))
    assignmentranking = db.Column(db.Integer)
    assignmentquestion = db.Column(db.String, nullable=False)
    
    def __repr__(self):
        return '<Assignment {}>'.format(self.assignmentid)

class UserAssignments(db.Model):
    __tablename__ = 'user_assignments'
    userid = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    assignmentid = db.Column(db.Integer, db.ForeignKey('assignment.assignmentid'), primary_key=True)
    status = db.Column(db.Integer)
    progress = db.Column(db.String)

    def __repr__(self):
        return '<UserAssignments {}>'.format(self.userid, self.assignmentid)

图表

我尝试了以下查询,但只得到了具有匹配的用户分配(进度)的分配。 (用户标识被赋予函数)

results = db.session.query(Assignment, UserAssignments).join(UserAssignments, (UserAssignments.assignmentid == Assignment.assignmentid)&(UserAssignments.userid==userid), isouter=True).filter(UserAssignments.userid==userid).all()

我还尝试了不带过滤器的查询,但这导致了所有用户分配(也来自其他用户)。

results = db.session.query(Assignment, UserAssignments).join(UserAssignments, (UserAssignments.assignmentid == Assignment.assignmentid)&(UserAssignments.userid==userid), isouter=True).all()
   

如前所述,我想获得一个列出所有分配的结果,当当前用户有一个分配时,其中包含用户分配。

尝试下一个查询

results = db.session.query(
   Assignment, 
   UserAssignments,
).join(
   UserAssignments, 
   UserAssignments.assignmentid == Assignment.assignmentid, 
   isouter=True,
).filter(
   or_(
      UserAssignments.userid == userid,
      UserAssignments.userid.is_(None),
   )
).all()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM