SQLAlchemy:如何通过!= condition连接表和过滤器?

时间:2018-03-07 04:19:23

标签: python mysql sqlalchemy flask-sqlalchemy

没有外键的SQLAlchemy for MySQL,我已经创建了这些表:

USER TABLE:
user_id
user_name

BLOCK TABLE:
user_id
blocked_user_id

POST TABLE:
post_id
post_user_id
post_content

COMMENT TABLE:
comment_id
comment_user_id
comment_content
post_id
post_user_id

我想选择帖子的评论而COMMENT.comment_user_id不在BLOCK.blocked_user_id,我已经尝试了这一点,但结果是空的:

comments = COMMENT.query.outerjoin(BLOCK, BLOCK.blocked_user_id == COMMENT.comment_user_id).filter(COMMENT.post_id == postid, COMMENT.post_user_id != current_user.user_id).all()

作为替代解决方案,我必须使用两个查询步骤,第一步选择所有blocked_users,第二步选择帖子的评论过滤

COMMENT.comment_user_id.notin_(blocked_users)

1 个答案:

答案 0 :(得分:0)

假设您可以在下面的sqlalchemy中使用session,当您在评论和阻止表上进行左连接时,查询将返回正确的结果

comments = session.query(COMMENT).outerjoin(BLOCK, COMMENT.user_id == BLOCK.user_id).filter(BLOCK.user_id == None).all()

所以你的原始查询会得到类似下面的内容

comments = COMMENT.query.outerjoin(BLOCK, COMMENT.blocked_user_id == BLOCK.comment_user_id).filter(BLOCK.blocked_user_id==None).all()

注意:上述查询仅过滤所有未被阻止的用户ID的注释表,您可以根据您对其他列的要求添加更多过滤条件