Как использовать лимит sqlalchemy с объединениемPython

Программы на Python
Anonymous
Как использовать лимит sqlalchemy с объединением

Сообщение Anonymous »

Приложение Фастапи. У меня есть модели

Код: Выделить всё

class State(str, enum.Enum):
WATCHING = "WATCHING"
WATCHED = "WATCHED"
DROPPED = "DROPPED"

class Anime(Base):
__tablename__ = "anime"
uuid = Column(UUID, primary_key=True, default=uuid.uuid4)
name = Column(String(128), nullable=False, unique=True)
state = Column(Enum(State), default=State.WATCHING)
rate = Column(Integer, nullable=True)
review = Column(String(4096), nullable=True)
start_end = relationship(
"AnimeStartEnd",
back_populates="anime",
order_by="AnimeStartEnd.start_date",
lazy="joined"
)

class AnimeStartEnd(Base):
__tablename__ = "anime_start_end"
id = Column(Integer, primary_key=True)
start_date = Column(Date)
end_date = Column(Date, nullable=True)
anime_id = Column(UUID, ForeignKey("anime.uuid"))
anime = relationship("Anime", back_populates="start_end")
И у меня есть service.py с функцией get_anime_list

Код: Выделить всё

async def get_anime_list(session: AsyncSession, limit: int, page: int):
subq = (
select(models.AnimeStartEnd)
.order_by(models.AnimeStartEnd.start_date)
.subquery()
)
stmt = (
select(models.Anime)
.join(subq)
.options(joinedload(models.Anime.start_end))
.limit(limit)
.offset((page - 1) * limit)
)

result = await session.execute(stmt)
anime_list = result.scalars().unique().all()

return anime_list
Я хочу получить список всех аниме с их start_end[/b], представленный в виде списка start_end, отсортированного по anime_start_end.start_date< /b> с примененным лимитом и смещением. Схема выглядит следующим образом:

Код: Выделить всё

[
{
"name": "string",
"state": "WATCHED",
"rate": 1,
"review": "string",
"start_end": [
{
"start_date": "2024-08-19",
"end_date": "2024-08-29"
},
{
"start_date": "2024-09-19",
"end_date": "2024-09-19"
}
],
"uuid": "string"
}
]
Но к подзапросу применяется ограничение, и я получаю неправильное количество аниме. Например. с пределом 5 и смещением 0: дамп базы данных аниме_start_end отсортирован по start_date и получает эти 4 аниме_ids и все их данные start_end.

Код: Выделить всё

id  start_date  end_date    anime_id                               | anime.name
9   2006-02-22  2016-09-12  6fe17741-527d-4537-b11f-7a0aa54b40fc   | Naruto
20  2006-04-13  2007-08-22  8a2dfd03-e856-45de-80fc-2db8ad519555   | Shaman King
17  2016-09-13  2016-09-20  ba377637-8c3c-4a0d-9ea7-2ec50ad260e8   | ...
18  2017-05-23  2017-05-25  ba377637-8c3c-4a0d-9ea7-2ec50ad260e8   | ...
13  2020-01-01  2020-02-02  2ca9fa6c-197a-47dc-8b5b-61bf30fcfa0c   | ...

Код: Выделить всё

[
{
"name": "Naruto",
"state": "WATCHED",
"rate": 10,
"review": "its been a long way",
"start_end": [
{
"start_date": "2006-02-22",
"end_date": "2016-09-12"
}
],
"uuid": "6fe17741-527d-4537-b11f-7a0aa54b40fc"
},
{
"name": "Shamag King",
"state": "WATCHED",
"rate": 9,
"review": "best opening",
"start_end": [
{
"start_date": "2006-04-13",
"end_date": "2007-08-22"
}
],
"uuid": "8a2dfd03-e856-45de-80fc-2db8ad519555"
},
{
"name": "Haikyuu!",
"state": "WATCHED",
"rate": 10,
"review": "best sport anime",
"start_end": [
{
"start_date": "2016-09-13",
"end_date": "2016-09-20"
},
{
"start_date": "2017-05-23",
"end_date": "2017-05-25"
},
{
"start_date": "2024-09-01",
"end_date": "2024-09-04"
}
],
"uuid": "ba377637-8c3c-4a0d-9ea7-2ec50ad260e8"
},
{
"name": "Testing transaction 2",
"state": "WATCHED",
"rate": 3,
"review": "not yet",
"start_end": [
{
"start_date": "2020-01-01",
"end_date": "2020-02-02"
},
{
"start_date": "2024-06-25",
"end_date": "2024-09-11"
}
],
"uuid": "2ca9fa6c-197a-47dc-8b5b-61bf30fcfa0c"
}
]
Как получить аниме_список длиной ==предел (с сортировкой по начальной_дате)?


Подробнее здесь: https://stackoverflow.com/questions/790 ... -with-join

Вернуться в «Python»