Вот то, что я использую, чтобы получить следующий / предыдущий из объекта, используя sqlalchemy.Идея состоит в том, чтобы получить row_number объекта из начального списка и выполнить другой запрос со смещением +/- 1.
Я использую подзапрос с ROW_NUMBER ( Как использовать ROW_NUMBER ()? ) для получения row_number из исходного запроса:
row_number = func.row_number().over(order_by=orders).label("row_number")
row_number_subquery = self.getlistquery(columns=chain([row_number], pk_columns)).subquery()
Затем я присоединяюсь к модели по первичным ключам:
join_clause = [getattr(row_number_query.c, pk.key) == getattr(model, pk.key) for pk in pk_columns]
Я фильтрую по первичным ключамobject:
filter = [getattr(model, pk.key) == pk_values[index] for index, pk in enumerate(pk_columns)]
Я создаю последний запрос для получения смещения объекта:
offset = db.session.query(row_number_subquery).join(model, *join_clause).filter(*filter).first()
Тогда элемент содержит offset
, необходимый для следующего, или offset-2
для предыдущего.(начиная с 1 для row_number и 0 для смещения)
self.getlistquery().offset(offset)