我在SQLAlchemy中有两个模型,具有多对多关系
team_user_table = Table('team_user', Base.metadata,
Column('user_id', Integer, ForeignKey('users.id')),
Column('team_id', Integer, ForeignKey('teams.id'))
)
class User(Base):
""" The SQLAlchemy declarative model class for a User object. """
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
class Team(Base):
""" The SQLAlchemy declarative model class for a Team object. """
__tablename__ = 'teams'
id = Column(Integer, primary_key=True)
name = Column(Text, unique=True)
members = relationship("User",
secondary=team_user_table,
backref="memberteams")
我想查询那些不是特定团队成员的用户。
在SQL中(例如):
SELECT u.id,u.name FROM users u WHERE u.id NOT IN (SELECT tu.user_id FROM team_user tu WHERE tu.team_id=?);
我如何在SQLAlchemy中执行此操作?
答案 0 :(得分:2)
这样做你想要的:
team_id = 1
query = session.query(User.id).filter(~User.memberteams.any(Team.id == team_id))
这是它输出的SQL(在MySQL上):
SELECT users.id AS users_id, users.name AS users_name
FROM users
WHERE NOT (EXISTS (SELECT 1
FROM team_user, teams
WHERE users.id = team_user.user_id AND teams.id = team_user.team_id AND teams.id = %s))
这不完全是您的查询现在的样子,但我认为这是它应该完成的方式。检查the docs for this。
我在MySQL上测试了这个。但是,我认为它应该适用于任何其他。
要获得您要查找的确切查询,您可能需要结合使用filter语句查看using subqueries。我认为您需要明确引用代码中的team_user
表来使其正常工作。
答案 1 :(得分:0)
我认为这应该有用,并且它不使用子查询。
session.query(User).join(team_users_table).filter(team_users_table.team_id != OTHER_TEAM)