如何查询那些未联接的对象 (SQLAlchemy)



我在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 中执行此操作?

这执行了您想要的操作:

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))

这不是您的查询现在的样子,但我认为这是应该完成的方式。请查看文档。

我在 MySQL 上对此进行了测试。但是,我认为它应该适用于任何其他人。

要获得要查找的确切查询,可能需要考虑将子查询与 filter 语句结合使用。我认为您需要显式引用代码中的team_user表才能使其正常工作。

我相信

这应该有效并且它不使用子查询。

session.query(User).join(team_users_table).filter(team_users_table.team_id != OTHER_TEAM)

最新更新