python – SQLAlchemy:排除从查询中的子查询中获取的行

前端之家收集整理的这篇文章主要介绍了python – SQLAlchemy:排除从查询中的子查询中获取的行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

抽象我的问题,我有2 tables.一个用户表和一个友谊表.

我正在尝试使用sqlAlchemy列出所有可以作为朋友添加到User 1,Alice以及排除自己的用户查询.

考虑到可能有很多友谊,找到爱丽丝的朋友:

  1. friend_subquery = db.session.query(Friendship).filter_by(User_id=1).subquery()

现在我想要列出所有用户,除了Alice和她的朋友Bob和Jack.

  1. friends = (db.session.query(User).
  2. filter(User.ID != 1).
  3. outerjoin(friend_subquery,User.ID != friend_subquery.c.Friend_id))

我的预期结果是获得用户4和5,但这个查询
返回除Alice自己以外的所有人的条件

  1. User.ID != friend_subquery.c.Friend_id

似乎没有像预期的那样工作.

附:我已经完成了搜索,阅读文档的作业,但无法弄明白.谢谢你的时间.

最佳答案
我假设您的模型定义如下:

  1. class User(db.Model):
  2. __tablename__ = 'User'
  3. ID = db.Column(db.Integer,primary_key=True)
  4. name = db.Column(db.String(100))
  5. friendships = db.relationship(
  6. 'Friendship',foreign_keys='Friendship.User_id',backref='friender',)
  7. friendships_of = db.relationship(
  8. 'Friendship',foreign_keys='Friendship.Friend_id',backref='friendee',)
  9. class Friendship(db.Model):
  10. __tablename__ = 'Friendship'
  11. ID = db.Column(db.Integer,primary_key=True)
  12. User_id = db.Column(db.Integer,db.ForeignKey('User.ID'))
  13. Friend_id = db.Column(db.Integer,db.ForeignKey('User.ID'))

在这种情况下,执行此查询的两种方法显示在下面的代码中.第一个查询依赖于User.friendships_of的关系,而第二个查询使用显式连接:

  1. # Add users
  2. u1,u2,u3,u4,u5 = users = [
  3. User(name="Alice"),User(name="Bob"),User(name="Jack"),User(name="Pluto"),User(name="Mike"),]
  4. db.session.add_all(users)
  5. # Add friendhips
  6. u1.friendships.append(Friendship(friendee=u2))
  7. u1.friendships.append(Friendship(friendee=u3))
  8. db.session.commit()
  9. # Find Alice
  10. u_alice = db.session.query(User).filter(User.name == 'Alice').one()
  11. # Query (version 1)
  12. q = (
  13. db.session.query(User)
  14. .filter(~User.friendships_of.any(Friendship.User_id == u_alice.ID))
  15. .filter(User.ID != u_alice.ID)
  16. .all()
  17. )
  18. for x in q:
  19. print(x)
  20. # Query (version 2)
  21. q = (
  22. db.session.query(User)
  23. .outerjoin(
  24. Friendship,db.and_(
  25. u_alice.ID == Friendship.User_id,User.ID == Friendship.Friend_id,)
  26. )
  27. .filter(Friendship.ID == None)
  28. .filter(User.ID != u_alice.ID)
  29. .all()
  30. )
  31. for x in q:
  32. print(x)

猜你在找的Python相关文章