2

SQLAlchemy に 2 つのモデルがあり、多対多の関係があります

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 でこれを行うにはどうすればよいですか?

4

2 に答える 2

2

これはあなたが望むことをします:

team_id = 1
query = session.query(User.id).filter(~User.memberteams.any(Team.id == team_id))

これは、(MySQL で) 出力する SQL です。

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でテストしました。しかし、私はそれが他のもので動作するはずだと思います。

探している正確なクエリを取得するには、フィルター ステートメントと組み合わせてサブクエリを使用することを検討する必要がある場合があります。team_userコードを機能させるには、コード内のテーブルへの明示的な参照が必要になると思います。

于 2012-07-03T21:37:07.070 に答える
0

これは機能するはずであり、サブクエリを使用していないと思います。

session.query(User).join(team_users_table).filter(team_users_table.team_id != OTHER_TEAM)
于 2012-07-04T06:30:04.527 に答える