基于 FastAPI + Pydantic v2 + SQLModel 的自动 CRUD 路由生成框架
Project description
nb_api
⚡️ 为你的数据模型闪电般地生成 CRUD API ⚡️
🚀 nb_api 是什么?
nb_api 是一个为现代 FastAPI 应用量身打造的 CRUD 路由自动生成框架。你只需定义好你的数据模型,nb_api 就能为你自动创建一整套完整、健壮且文档齐全的增、删、改、查(CRUD)API 接口。
nb_api 旨在解决为 FastAPI 应用重复编写 CRUD 接口的痛点。它支持多种数据存储后端,提供了更强大、更现代化的功能。
✨ 核心优势
- 多数据库支持: 支持 SQLModel、SQLAlchemy、Tortoise 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_api 为 Book 模型自动生成的所有接口!
🌟 功能展示
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自动生成的接口
这些接口都是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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52e31de22aa4cdb189ab1f049d008a9ef93dcbce1ea021af7a017f166682b84b
|
|
| MD5 |
ace50ce66275d246ef89efa02a14c272
|
|
| BLAKE2b-256 |
27e7cd58d76f1dc14f2fd11b9a5dd20dc13af04dd5c029daea8a0be36ce71de8
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b292d509b69509a88e01f4c896434ca7ff6be60c3794de166a401e5b9a92eb3
|
|
| MD5 |
9ab13f4261dcaec3abb4190f50ffc6dd
|
|
| BLAKE2b-256 |
131cf13409e384948fb179b4e3ee7d9181ff3f7ee5880b7ccd218e9add8b3dec
|