Как эффективно запрашивать в SQLAlchemy все группы и проверять, принадлежит ли к каждой из известных пользователей - PullRequest
0 голосов
/ 30 мая 2020

У меня есть модель «многие-ко-многим», такая как пресловутые пользователи и группы:

users_groups_table= Table('users_in_groups', Base.metadata,
    Column('group_id', Integer(), ForeignKey('group.id'), primary_key=True),
    Column('user_id', Integer(), ForeignKey('user.id'), primary_key=True)

class User(Base):
    __tablename__ = 'user'
    id = Column(Integer(), primary_key=True)
    groups = relationship("Group", secondary=users_groups_table, backref="members")

class Group(Base):
    __tablename__ = 'group'
    id = Column(Integer(), primary_key=True)

Итак, в конечном итоге, я запрашиваю одну из них и хочу указать, когда известный экземпляр другой присутствует во взаимосвязи.

Я мог бы сделать что-то вроде:

user = session.query(User).get(known_user_id)

groups = session.query(Group).all()
for g in groups:
    if user in g.members:
        # ...

Однако я чувствую, что в конечном итоге это приведет к выполнению запроса для каждой группы, чтобы получить список пользователей, что может быть огромным списком, и провести в нем тест, когда достаточно информации известно с самого начала, и я думаю, что все это можно было бы сформировать более эффективно.

Думаю, я мог бы запросить группы пользователей принадлежит однажды, и проверьте, входит ли каждая группа в этот набор. Но это лучшее решение? Что делать, если существует ТОННЫ групп, и я просматриваю только подмножество в моем запросе?

Я просто чувствую, что мне не хватает лучшего способа структурировать начальный запрос, чтобы получить именно те данные, которые я хочу без в результате получается элемент pythoni c в тестах списка для каждого элемента.

Например:

Допустим, у меня есть сложный запрос и возвращаются группы с идентификаторами: [100, 500, 999] . И предположим, что пользователь является членом # 500, и всех от # 1000 до # 10000000. Я хочу вернуть что-то вроде:

(group<id 1>, false)
(group<id 500>, true)
(group<id 999, false)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...