簡體   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