Я пытаюсь реализовать метод 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')
)
Идеальным вариантом для меня будет:
выберите некоторые связанные строки на экране на основе идентификатора пользователя
table_filter = Screen.users.any(id='some_user_id')
имеютвозможность запуска оконной функции для предыдущего выбора для разбивки на страницы.
Можно ли достичь этого результата с помощью ORM?