如何使所有行不在多对多关系中

时间:2014-03-24 19:12:06

标签: sqlalchemy flask-sqlalchemy

我需要让所有没有引用该组的用户。 在SQL中它就像NOT EXIST。但是我不知道它是如何在SQLAlchemy的ORM中完成的。

models.py

group_table = Table('assoc_groups_users', Base.metadata,
                Column('user_id', Integer, ForeignKey('users.id')),
                Column('group_id', Integer, ForeignKey('groups.id'))
                )

class Users(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    name = Column(String(50), unique=False)

class Groups(Base):
    __tablename__ = "groups"
    id = Column(Integer, primary_key=True)
    title = Column(String(127))

    users = relationship("Users",
                           secondary=books_table,
                           backref=backref("books", lazy='dynamic'))

1 个答案:

答案 0 :(得分:2)

使用relationship s(小而简单的代码,但更详细的SQLEXISTS并且并非真正需要groups表上的JOIN:

query = session.query(Users).filter(~Users.groups.any())

否则,将outerjoinwhere一起使用,这是非常直接的,并生成SQL类似于一对一的查询:

query = (session.query(Users)
        .outerjoin(group_table, group_table.c.user_id == Users.id)
        .filter(group_table.c.user_id == None)
        )