python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python FastAPI+FastCRUD生成API接口

Python使用FastAPI+FastCRUD自动生成API接口的实现

作者:Java私教

FastCRUD 是一个为 FastAPI + SQLAlchemy 场景设计的开源库,由 Benav Labs 维护,旨在简化 CRUD 端点搭建与数据库操作的流程,本文呢给大家介绍了Python使用FastAPI+FastCRUD自动生成API接口的实现,需要的朋友可以参考下

一、项目背景与定位

FastCRUD 是一个为 FastAPI + SQLAlchemy 场景设计的开源库,由 Benav Labs 维护,旨在简化 CRUD 端点搭建与数据库操作的流程。其 GitHub 仓库描述如下:

“FastCRUD is a Python package for FastAPI, offering robust async CRUD operations and flexible endpoint creation utilities.” ([GitHub][1])

核心特性包括:全异步、支持 SQLAlchemy 2.0、支持 joins、支持动态排序、支持 offset 和 cursor 分页。([GitHub][1])

为什么会有这样一个库?

在使用 FastAPI + SQLAlchemy 时,开发典型的 CRUD 接口(Create/Read/Update/Delete)往往需要重复以下工作:

FastCRUD 正是在这样的场景下诞生:通过抽象通用的 CRUD 操作以及自动生成路由,帮助你用更少的代码快速搭建 API 原型或轻量服务。

例如,在一篇作者介绍文章中提到:“你写了很多重复代码…用 FastCRUD,这些代码可以显著减少”。([Medium][2])

二、核心特性解析

下面逐条解析 FastCRUD 提供的主要特性,并讨论其背后的价值。

2.1 全异步 (Async)

FastCRUD 建立于 FastAPI + SQLAlchemy 异步模型之上,支持 AsyncSession 等异步 API。GitHub 上标注为 “⚡️ Fully Async”。([GitHub][1])

2.2 支持 SQLAlchemy 2.0

FastCRUD 要求 SQLAlchemy 版本为 2.0+。([PyPI][3])

2.3 强大的 CRUD 功能 + 自动生成端点

FastCRUD 在 CRUD 操作方面提供了:create, get, exists, count, get_multi 等通用方法。([PyPI][3]) 此外,它还提供 crud_router,允许你几行代码就生成一个标准的 CRUD 路由器。示例如下:([GitHub][1])

item_router = crud_router(
    session=get_session,
    model=Item,
    create_schema=ItemCreateSchema,
    update_schema=ItemUpdateSchema,
    path="/items",
    tags=["Items"],
)
app.include_router(item_router)

2.4 复杂查询能力:动态排序/分页/联表 (joins)

FastCRUD 支持以下特性:

2.5 模块化 & 可扩展设计

FastCRUD 声称自己是 “Modular and Extensible”。([GitHub][1])

三、快速上手示例

下面通过一个简单的 “Items” 模型示例演示如何使用 FastCRUD。

3.1 环境准备

假设你已经安装了:

pip install fastcrud

并且项目中已有 FastAPI/SQLAlchemy 2 配置。根据 PyPI 信息:FastCRUD 要求 Python 3.9+、SQLAlchemy 2.0.21+、Pydantic 2.4.1+。([PyPI][3])

3.2 定义模型与 schema

models.py

from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import DeclarativeBase

class Base(DeclarativeBase):
    pass

class Item(Base):
    __tablename__ = 'items'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    description = Column(String)

schemas.py

from pydantic import BaseModel

class ItemCreateSchema(BaseModel):
    name: str
    description: str

class ItemUpdateSchema(BaseModel):
    name: str
    description: str

3.3 应用配置 & 路由自动生成

main.py

from fastapi import FastAPI
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from fastcrud import crud_router
from models import Base, Item
from schemas import ItemCreateSchema, ItemUpdateSchema

DATABASE_URL = "sqlite+aiosqlite:///./test.db"
engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

async def get_session() -> AsyncSession:
    async with async_session() as session:
        yield session

async def lifespan(app: FastAPI):
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    yield

app = FastAPI(lifespan=lifespan)

item_router = crud_router(
    session=get_session,
    model=Item,
    create_schema=ItemCreateSchema,
    update_schema=ItemUpdateSchema,
    path="/items",
    tags=["Items"],
)
app.include_router(item_router)

启动后,你就会在 /docs 中看到 CRUD 接口(例如 POST /items/, GET /items/{id}, PATCH /items/{id}, DELETE /items/{id},列表接口等)。这个省去了大量重复代码。文章中即有示例。([Medium][2])

3.4 在自定义路由中使用

如果你需要更灵活控制,比如在路径、逻辑、权限等方面,FastCRUD 也支持直接用其 FastCRUD 类。示例:([PyPI][3])

from fastcrud import FastCRUD

item_crud = FastCRUD(Item)

@app.post("/custom/items/")
async def create_item(item_data: ItemCreateSchema, db: AsyncSession = Depends(get_session)):
    return await item_crud.create(db, item_data)

@app.get("/custom/items/{item_id}")
async def read_item(item_id: int, db: AsyncSession = Depends(get_session)):
    item = await item_crud.get(db, id=item_id)
    if not item:
        raise HTTPException(status_code=404, detail="Item not found")
    return item

这样你保留了自定义控制流,同时利用其 CRUD 基础逻辑。

四、深入机制剖析

4.1 CRUD 类的方法

根据文档,FastCRUD 提供若干关键方法(摘录自 PyPI):

此外还有更高级如 get_joinedget_multi_joinedget_multi_by_cursor 等用于 join 和 cursor 分页。([PyPI][3])

4.2 自动生成 Router 的机制

crud_router 的实现会内部创建标准的 FastAPI 路由(POST、GET、PATCH、DELETE、列表等),并且使用上面 CRUD 方法作为 handler。它还接受 session factory、model、schema、path、tags 等参数。通过这层抽象,开发者并不需要每次手动写路由定义。

4.3 Pagination & Sorting

这些都是常见但自己手写较繁琐的逻辑,使用 FastCRUD 可以省掉不少代码。

4.4 Join 支持

get_joinedget_multi_joined 方法支持将主模型与其它模型做关联查询。对于 ORM 模型间关系(ForeignKey、relationship)或显式 join_on 条件,FastCRUD 支持自动检测 join 条件。([GitHub][1]) 不过,这里也有“隐藏成本”——如果你的 join 逻辑非常定制(如多级 join、复杂子查询、聚合等),仍可能需要手写 SQL。

五、优点 & 使用场景

优点

使用场景

六、局限性 &注意事项

局限性

注意事项

七、实战建议与最佳实践

八、总结

FastCRUD 是一个非常实用的工具,尤其适合你希望用 FastAPI 快速搭建 CRUD 接口、减少重复代码、聚焦核心业务逻辑的场景。它通过全异步支持、SQLAlchemy 2.0、自动路由生成、分页排序 join 支持等特性,实现了 “少写代码、快上线” 的目标。但同时,它并不是万能——对于复杂业务、深度定制、非标准模型或者非 SQLAlchemy ORM 环境,仍需谨慎使用。

在未来,如果你的项目方向是构建一个标准化、可维护、高效的后端服务,FastCRUD 可以作为一个优秀的 “CRUD 基础层”。你可以把它作为 标准 CRUD 模型生成器 + 自定义逻辑插件层,形成 “自动化 + 可扩展” 的架构。

以上就是Python使用FastAPI+FastCRUD自动生成API接口的实现的详细内容,更多关于Python FastAPI+FastCRUD生成API接口的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文