Skip to main content

基于 FastAPI + Pydantic v2 + SQLModel 的自动 CRUD 路由生成框架

Project description

nb_api

⚡️ 为你的数据模型闪电般地生成 CRUD API ⚡️

PyPI - Python Version License


🚀 nb_api 是什么?

nb_api 是一个为现代 FastAPI 应用量身打造的 CRUD 路由自动生成框架。你只需定义好你的数据模型,nb_api 就能为你自动创建一整套完整、健壮且文档齐全的增、删、改、查(CRUD)API 接口。

nb_api 旨在解决为 FastAPI 应用重复编写 CRUD 接口的痛点。它支持多种数据存储后端,提供了更强大、更现代化的功能。

✨ 核心优势

  • 多数据库支持: 支持 SQLModelSQLAlchemyTortoise ORM内存存储,满足不同场景需求
  • 现代化技术栈: 完全基于 FastAPI + Pydantic v2 构建,享受最新的性能优化和最完善的类型提示
  • 高度自动化: 告别重复编写 CRUD 样板代码,让你专注于核心业务逻辑
  • 强大的搜索能力: 内置"超级搜索"接口,允许前端通过 JSON 动态构建复杂的过滤和排序查询
  • 规范的 API 设计: 所有响应都封装在统一的 ResponseModel 中,无论是成功还是失败,都有一致的结构,极大简化了前端处理
  • 生产级特性: 开箱即用的分页、依赖注入、慢请求日志记录等功能,让你的应用兼具开发效率和生产环境下的可观测性
  • 灵活可扩展: 轻松禁用、覆盖默认路由,或添加自定义路由,满足你的所有特殊需求

🛠️ 安装

pip install very_nb_api fastapi sqlmodel uvicorn

注意安装和实际导入不同,因为提示nb_api这个名字和pypi已存在的包相似冲突了

安装

pip install very_nb_api

导入

import nb_api

快速开始

SQLModel 版本

在短短十几行代码内,即可拥有一个功能完备的 CRUD API。

# main.py
from typing import Optional
from sqlmodel import Field, Session, SQLModel, create_engine
from fastapi import FastAPI
from nb_api import SQLModelCRUDRouter

# 1. 定义 SQLModel 模型
class Book(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    title: str
    author: str

# 2. 设置数据库
engine = create_engine("sqlite:///database.db")

def get_session():
    with Session(engine) as session:
        yield session

# 3. 创建 FastAPI 应用和 nb_api 路由
app = FastAPI()

@app.on_event("startup")
def on_startup():
    SQLModel.metadata.create_all(engine)

# 核心用法!
app.include_router(
    SQLModelCRUDRouter(schema=Book, db_model=Book, db_session=get_session)
)

异步 SQLModel 版本

# main.py
from typing import Optional, AsyncGenerator
from sqlmodel import Field, SQLModel
from sqlalchemy.ext.asyncio import create_async_engine
from sqlmodel.ext.asyncio.session import AsyncSession
from fastapi import FastAPI
from nb_api import AioSQLModelCRUDRouter

# 1. 定义 SQLModel 模型
class Book(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    title: str
    author: str

# 2. 设置异步数据库
DATABASE_URL = "sqlite+aiosqlite:///database.db"
engine = create_async_engine(DATABASE_URL)

async def get_session() -> AsyncGenerator[AsyncSession, None]:
    async with AsyncSession(engine) as session:
        yield session

# 3. 创建 FastAPI 应用和 nb_api 路由
app = FastAPI()

# 核心用法!
app.include_router(
    AioSQLModelCRUDRouter(schema=Book, db_model=Book, db=get_session)
)

Tortoise ORM 版本

# main.py
from typing import Optional
from tortoise.models import Model
from tortoise import fields
from tortoise.contrib.fastapi import register_tortoise
from fastapi import FastAPI
from pydantic import BaseModel
from nb_api import TortoiseCRUDRouter

# 1. 定义 Tortoise ORM 模型
class Book(Model):
    id = fields.IntField(pk=True)
    title = fields.CharField(max_length=100)
    author = fields.CharField(max_length=100)

# 2. 定义 Pydantic 模型
class BookSchema(BaseModel):
    id: int
    title: str
    author: str

    class Config:
        from_attributes = True

# 3. 创建 FastAPI 应用
app = FastAPI()

# 4. 注册 Tortoise ORM
register_tortoise(
    app,
    db_url="sqlite://db.sqlite3",
    modules={"models": ["__main__"]},
    generate_schemas=True,
    add_exception_handlers=True
)

# 核心用法!
app.include_router(
    TortoiseCRUDRouter(schema=BookSchema, db_model=Book, prefix="books")
)

内存版本(无需数据库)

# main.py
from typing import Optional
from pydantic import BaseModel
from fastapi import FastAPI
from nb_api import MemoryCRUDRouter

# 1. 定义 Pydantic 模型
class Book(BaseModel):
    id: Optional[int] = None
    title: str
    author: str

# 2. 创建 FastAPI 应用
app = FastAPI()

# 核心用法!
app.include_router(
    MemoryCRUDRouter(schema=Book, prefix="books")
)

启动应用 uvicorn main:app --reload,然后访问 http://127.0.0.1:8000/docs,你将看到 nb_apiBook 模型自动生成的所有接口!

🌟 功能展示

1. 自动生成的 CRUD 路由

路由 方法 描述
/book GET 获取所有书籍 (支持分页)
/book POST 创建一本新书
/book DELETE 删除所有书籍
/book/{item_id} GET 获取指定 ID 的书籍
/book/{item_id} PUT 更新指定 ID 的书籍
/book/{item_id} DELETE 删除指定 ID 的书籍
/book/search POST 超级搜索接口

2. 超级搜索接口 (/search)

这是 nb_api 的独有功能!通过一个 POST 请求,实现复杂的动态查询。

请求: POST /book/search 请求体:

{
  "filters": [
    { "field": "author", "operator": "contains", "value": "Tolkien" },
    { "field": "id", "operator": "in", "value": [1, 3, 5] }
  ],
  "sorting": [
    { "field": "title", "direction": "asc" }
  ]
}

3. 统一的 API 响应

成功响应:

{
  "status_code": 0,
  "msg": "success",
  "data": { "id": 1, "title": "The Hobbit", "author": "J.R.R. Tolkien" }
}

错误响应:

{
  "status_code": 404,
  "msg": "Item not found"
}

4. 路由定制与扩展

nb_api 提供了丰富的初始化参数来定制路由行为。

from fastapi import Depends

router = SQLModelCRUDRouter(
    schema=Book,
    db_model=Book,
    db_session=get_session,
    
    # --- 功能配置 ---
    paginate=50,                  # 设置分页最大数量

    
    # --- 路由控制 ---
    prefix="my-books",            # 自定义路由前缀
    tags=["图书管理"],            # 自定义 OpenAPI 标签
    delete_all_route=False,       # 禁用"删除所有"路由
    
    # --- 依赖注入 (权限控制) ---
    update_route=[Depends(require_admin_user)],
    create_route=[Depends(require_login)]
)

你也可以像使用普通的 APIRouter 一样,轻松地覆盖或添加新路由。

# 覆盖默认的 get_one 路由
@router.get("/{item_id}")
def custom_get_one(item_id: int):
    return {"message": f"You are viewing book {item_id} with a custom route!"}

# 添加一个全新的路由
@router.post("/{item_id}/publish")
def publish_book(item_id: int):
    # ... 发布逻辑 ...
    return {"message": "Book published!"}

5 一个接口没写,下面都是nb_api自动生成的接口

接口文档截图: pVXA2ZD.png

这些接口都是nb_api自动生成的,你只需要定义好你的数据模型,nb_api就会自动生成这些接口,全部都不是人工手写def 的 fastapi 接口

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

very_nb_api-0.7.tar.gz (19.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

very_nb_api-0.7-py3-none-any.whl (23.3 kB view details)

Uploaded Python 3

File details

Details for the file very_nb_api-0.7.tar.gz.

File metadata

  • Download URL: very_nb_api-0.7.tar.gz
  • Upload date:
  • Size: 19.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.0

File hashes

Hashes for very_nb_api-0.7.tar.gz
Algorithm Hash digest
SHA256 52e31de22aa4cdb189ab1f049d008a9ef93dcbce1ea021af7a017f166682b84b
MD5 ace50ce66275d246ef89efa02a14c272
BLAKE2b-256 27e7cd58d76f1dc14f2fd11b9a5dd20dc13af04dd5c029daea8a0be36ce71de8

See more details on using hashes here.

File details

Details for the file very_nb_api-0.7-py3-none-any.whl.

File metadata

  • Download URL: very_nb_api-0.7-py3-none-any.whl
  • Upload date:
  • Size: 23.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.0

File hashes

Hashes for very_nb_api-0.7-py3-none-any.whl
Algorithm Hash digest
SHA256 7b292d509b69509a88e01f4c896434ca7ff6be60c3794de166a401e5b9a92eb3
MD5 9ab13f4261dcaec3abb4190f50ffc6dd
BLAKE2b-256 131cf13409e384948fb179b4e3ee7d9181ff3f7ee5880b7ccd218e9add8b3dec

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page