Example #1
0
async def paginate(
    db: Database,
    query: Select,
    params: Optional[AbstractParams] = None,
    *,
    convert_to_mapping: bool = True,
) -> AbstractPage:
    params = resolve_params(params)

    total = await db.fetch_val(
        select([func.count()]).select_from(query.alias()))
    items = await db.fetch_all(paginate_query(query, params))

    if convert_to_mapping:
        items = [{**item} for item in items]

    return create_page(items, total, params)
Example #2
0
async def paginate(query: Select,
                   params: Optional[AbstractParams] = None) -> AbstractPage:
    params = resolve_params(params)

    try:
        is_loader_used = query._execution_options[
            "loader"]._distinct  # type: ignore
    except (AttributeError, KeyError):
        is_loader_used = False

    if is_loader_used:
        # FIXME: find better way to fetch rows when loader is used
        items = await query.gino.all()  # type: ignore
        return base_paginate(items, params)

    total = await func.count().select().select_from(query.alias()
                                                    ).gino.scalar()
    items = await paginate_query(query, params).gino.all()  # type: ignore

    return create_page(items, total, params)