-
Notifications
You must be signed in to change notification settings - Fork 126
/
sqlalchemy.py
35 lines (21 loc) 路 870 Bytes
/
sqlalchemy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from __future__ import annotations
from typing import Any, Optional, TypeVar
from sqlalchemy.orm import Query
from sqlalchemy.sql import Select
from ..api import create_page, resolve_params
from ..bases import AbstractPage, AbstractParams
T = TypeVar("T", Select, Query)
def paginate_query(query: T, params: AbstractParams) -> T:
raw_params = params.to_raw_params()
return query.limit(raw_params.limit).offset(raw_params.offset)
def _to_dict(obj: Any) -> Any:
try:
return obj._asdict()
except AttributeError:
return obj
def paginate(query: Query, params: Optional[AbstractParams] = None) -> AbstractPage:
params = resolve_params(params)
total = query.count()
items = [_to_dict(item) for item in paginate_query(query, params)]
return create_page(items, total, params)
__all__ = ["paginate_query", "paginate"]