SQLAlchemy - запрос «многие ко многим» с таблицей ассоциаций - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь запросить многие ко многим с таблицей ассоциации, но безуспешно. Это моя модель:

favourite_events_association_table = Table('favourite_events', db.Model.metadata,
    db.Column('user_uuid', UUID(as_uuid=True), db.ForeignKey('p_user.uuid'), nullable=False),
    db.Column('event_uuid', UUID(as_uuid=True), db.ForeignKey('event.uuid'), nullable=False),
    extend_existing=True
)

class User(db.Model, UserMixin):
    __tablename__ = 'p_user'

    uuid = db.Column(UUID(as_uuid=True), unique=True, nullable=False, primary_key=True, default=uuid.uuid4)
    favourite_events = db.relationship('Event', secondary=favourite_events_association_table)
    ....

class Event(db.Model):
    uuid = db.Column(UUID(as_uuid=True), unique=True, nullable=False, primary_key=True, default=uuid.uuid4)
    start = db.Column(db.DateTime(timezone=False), nullable=False)
    ...

Что мне нужно сделать, так это просто запросить все события, связанные с пользователем x при запуске> заданного порядка дат по началу. В sql есть:

select e.uuid 
from event e
inner join favourite_events fa on fa.event_uuid = e.uuid
where fa.user_uuid = 'uuid'
and e."start"  > 'date'
order by e."start" desc

В данный момент я делаю итерации по списку:

for event in current_user.favourite_events:
    if event.start > now:
        events.append(event)

Но мне, очевидно, не нравится это решение, так как у меня также есть переупорядочить список вручную.

Любые предложения о том, как сделать этот запрос с sqlalchemy?

В случае этой итерации sql Алхимия выполняет запрос на каждой итерации (выберите * из событие, где uuid = 'uuid') или выполняет один запрос для получения всей ассоциации (выберите * из события, где uuid в (..))?

Спасибо.

1 Ответ

0 голосов
/ 08 апреля 2020

Я узнаю, как сделать мой запрос с использованием sqlalchemy:

Event.query.join(User.favourite_events).filter(User.uuid==current_user.uuid).filter(Event.start >= dt).all()

Также после некоторой отладки кажется, что sqlalchemy будет выполнять выборку mysql на каждой итерации по коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...