2012-07-03 66 views
2

我有兩個型號在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的?

回答

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上測試了這個。但是,我認爲它應該適用於其他任何方面。

要獲得您正在查找的確切查詢,您可能需要查看using subqueries與過濾器語句的組合。我想你需要在代碼中明確引用team_user表,才能使其工作。

+0

是的這項工作(也在sqllite)!謝謝! –

0

我相信這應該工作,它不使用子查詢。

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

此查詢不起作用。首先,team_users_table只是一張表,因此沒有team_id作爲參數。 (team_users_table.team_id部分)。其次,這將只給予任何其他團隊成員的人員,即使是原團隊成員的成員。 –

+0

我不認爲這個查詢會做你期望的,但爲了讓它「工作」,你需要使用'team_users_table.c.team_id'(注意'.c'因爲你正在訪問** c ** olumn的表)訪問該字段。 – jadkik94

+0

你們都是對的。謝謝 :)。 – Salil