6

我阅读了 fastapi contrib 代码。分页仅适用于 mongodb。fastapi 是否也有用于 postgres db 的分页模块?

4

3 回答 3

8

您可以使用fastapi-pagination模块,它目前与sqlalchemy和集成gino

用法将如下所示:

from fastapi_pagination import Page, PaginationParams
from fastapi_pagination.ext.sqlalchemy import paginate


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String, nullable=False)
    email = Column(String, nullable=False)


class UserModel(BaseModel):
    id: int
    name: str
    email: str

    class Config:
        orm_mode = True


app = FastAPI()

@app.get('/users', response_model=Page[UserModel])
def get_users(db: Session = Depends(get_db), params: PaginationParams = Depends()):
    return paginate(db.query(User), params)

请注意,这段代码的目的是展示fastapi-paginationAPI。您可以在这里找到一个完整的工作示例:https ://github.com/uriyyo/fastapi-pagination/blob/main/examples/pagination_sqlalchemy.py

于 2020-11-06T19:42:46.540 回答
4

库中没有任何自动内置的功能,但您可以通过查询参数进行设置并将其传递给您的 ORM,例如 SQL Alchemy 中查询对象的 offset() 和 limit() 方法。

这个来自FastAPI 的查询参数文档的示例让他们在静态数据集上使用它:

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]


@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
    return fake_items_db[skip : skip + limit]
于 2020-05-15T20:27:24.017 回答
0

目前,没有内置的分页系统。您可以查看fastapi-pagination模块。或者你可以这样做:

def get_data(database: Session, page: int = 0, limit: int = 50):
    # Note not the best option for large data sets.
    try:
        data = database.query(YourBaseModel).offset(page).limit(limit).all()
        return data
    except Exception as e:
        logger.exception(e)
        raise HTTPException(status_code=500, detail='There was an error while processing your request.')

还有你的 API 代码:

@app.get('/data')
def example_data_api(database: Session = Depends(get_db), page: int = 0, limit: int = 50):
    return get_data(database=database, page=page, limit=limit)
于 2021-12-27T11:38:21.840 回答