[英]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.