Вопрос

I need get all users that do not refer to the group. In SQL it's like NOT EXIST. But I don't know how do it within SQLAlchemy's 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'))
Это было полезно?

Решение

Using relationships (small and simple code, but a bit more verbose SQL with EXISTS and not really required JOIN on groups table):

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

Otherwise, using outerjoin with where, which is very direct and generates SQL resembling one-to-one the query:

query = (session.query(Users)
        .outerjoin(group_table, group_table.c.user_id == Users.id)
        .filter(group_table.c.user_id == None)
        )
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top