【问题标题】:How to query those Objects that are not joined (SQLAlchemy)如何查询那些未加入的对象(SQLAlchemy)
【发布时间】:2012-07-04 15:25:56
【问题描述】:

我在 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 中做到这一点?

【问题讨论】:

    标签: python sql sqlalchemy


    【解决方案1】:

    这就是你想要的:

    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 上对此进行了测试。但是,我认为它应该适用于任何其他。

    要获得您要查找的确切查询,您可能需要结合过滤语句查看using subqueries。我认为您需要在代码中明确引用 team_user 表才能使其正常工作。

    【讨论】:

      【解决方案2】:

      我相信这应该可行,并且它不使用子查询。

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

      【讨论】:

      • 此查询无效。首先,team_users_table 只是一个表,因此没有 team_id 作为参数。 (team_users_table.team_id 部分)。其次,这只会给属于任何其他团队成员的人,即使是原始团队的成员。
      • 我不认为查询会做你所期望的,但要让它“工作”你需要使用team_users_table.c.team_id(注意.c,因为你正在访问一个c 表的列)来访问该字段。
      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 2014-07-29
      • 1970-01-01
      • 2023-03-29
      • 2018-12-06
      • 1970-01-01
      • 2018-08-12
      相关资源
      最近更新 更多