Расширьте WindowedRangeQuery для двунаправленного отношения многие ко многим - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь реализовать метод paginate для моей сборки остальных API с Flask.Я хочу избежать использования методов, которые полагаются на OFFSET и LIMIT, и я нашел отличный пример sqlalchemy здесь для использования оконной функции Postgresql в качестве надежной альтернативы

Эта реализация прекрасно работает, но я хочуадаптируйте его для выбора из множества-многих, а не только из одной таблицы.

Основная часть такова:

q = s.query(Playlist)

q.session.query(
       Playlist.id,
       func.row_number().over(order_by=Playlist.id).label('rownum'),
).from_self(Playlist.id)

и генерирует следующий SQL:

SELECT anon_1.screens_id AS anon_1_screens_id 
FROM (SELECT screens.id AS screens_id, row_number() OVER (ORDER BY screens.id) AS rownum 
FROM screens) AS anon_1 

Мне нужно изменить часть FROM screens.В конце я хочу получить следующий SQL:

SELECT anon_1.screen_id, 
FROM (SELECT screens.id as screen_id, row_number() OVER (ORDER BY screens.id) AS rownum
FROM users_screens, users, screens WHERE screens.id = users_screens.screen_id AND users.id = users_screens.user_id AND users.id = 'some_user_id'
)AS anon_1 

При необходимости мои модели и отношения между ними:


users_screens_association = Table('users_screens', Base.metadata,
    Column('user_id', Integer, ForeignKey('users.id')),
    Column('screen_id', Integer, ForeignKey('screens.id'))
)

class User(UserMixin, Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    # other columns are also defined

    screens = relationship('Screen',
                           secondary=users_screens_association,
                           back_populates='users',
                           lazy='dynamic')

class Screen(Base):
    __tablename__ = 'screens'

    id = Column(Integer, primary_key=True)
    # other columns are also defined

    users = relationship('User',
                         secondary=users_screens_association,
                         back_populates='screens')
)

Идеальным вариантом для меня будет:

  1. выберите некоторые связанные строки на экране на основе идентификатора пользователя

    • table_filter = Screen.users.any(id='some_user_id')
  2. имеютвозможность запуска оконной функции для предыдущего выбора для разбивки на страницы.

Можно ли достичь этого результата с помощью ORM?

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