Python使用FastAPI+FastCRUD自動(dòng)生成API接口的實(shí)現(xiàn)
一、項(xiàng)目背景與定位
FastCRUD 是一個(gè)為 FastAPI + SQLAlchemy 場(chǎng)景設(shè)計(jì)的開(kāi)源庫(kù),由 Benav Labs 維護(hù),旨在簡(jiǎn)化 CRUD 端點(diǎn)搭建與數(shù)據(jù)庫(kù)操作的流程。其 GitHub 倉(cāng)庫(kù)描述如下:
“FastCRUD is a Python package for FastAPI, offering robust async CRUD operations and flexible endpoint creation utilities.” ([GitHub][1])
核心特性包括:全異步、支持 SQLAlchemy 2.0、支持 joins、支持動(dòng)態(tài)排序、支持 offset 和 cursor 分頁(yè)。([GitHub][1])
為什么會(huì)有這樣一個(gè)庫(kù)?
在使用 FastAPI + SQLAlchemy 時(shí),開(kāi)發(fā)典型的 CRUD 接口(Create/Read/Update/Delete)往往需要重復(fù)以下工作:
- 定義 SQLAlchemy 模型(Model)和 Pydantic 模型(Schema)
- 編寫(xiě)增刪改查邏輯(Session 管理、commit/refresh、異常處理)
- 在路由里創(chuàng)立對(duì)應(yīng)的 endpoint、設(shè)置依賴、處理分頁(yè)/排序/過(guò)濾
- 如果涉及多表關(guān)聯(lián)(join)或復(fù)雜查詢,則代碼量又進(jìn)一步增加
FastCRUD 正是在這樣的場(chǎng)景下誕生:通過(guò)抽象通用的 CRUD 操作以及自動(dòng)生成路由,幫助你用更少的代碼快速搭建 API 原型或輕量服務(wù)。
例如,在一篇作者介紹文章中提到:“你寫(xiě)了很多重復(fù)代碼…用 FastCRUD,這些代碼可以顯著減少”。([Medium][2])
二、核心特性解析
下面逐條解析 FastCRUD 提供的主要特性,并討論其背后的價(jià)值。
2.1 全異步 (Async)
FastCRUD 建立于 FastAPI + SQLAlchemy 異步模型之上,支持 AsyncSession 等異步 API。GitHub 上標(biāo)注為 “?? Fully Async”。([GitHub][1])
- 優(yōu)勢(shì):在高并發(fā) HTTP 請(qǐng)求場(chǎng)景下,更好地利用 I/O 等待時(shí)間,不阻塞事件循環(huán)。
- 注意事項(xiàng):你的數(shù)據(jù)庫(kù)驅(qū)動(dòng)、SQLAlchemy 版本、session 配置必須配合異步使用,否則可能出現(xiàn)混用同步/異步問(wèn)題。
2.2 支持 SQLAlchemy 2.0
FastCRUD 要求 SQLAlchemy 版本為 2.0+。([PyPI][3])
- 優(yōu)勢(shì):利用最新 SQLAlchemy 的特性(如 2.0 風(fēng)格的 API、async 支持、改進(jìn)的 ORM 性能)。
- 注意事項(xiàng):如果項(xiàng)目還在用 SQLAlchemy 1.x,升級(jí)成本可能不低。
2.3 強(qiáng)大的 CRUD 功能 + 自動(dòng)生成端點(diǎn)
FastCRUD 在 CRUD 操作方面提供了:create, get, exists, count, get_multi 等通用方法。([PyPI][3]) 此外,它還提供 crud_router,允許你幾行代碼就生成一個(gè)標(biāo)準(zhǔn)的 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)
- 優(yōu)勢(shì):極大縮短原型開(kāi)發(fā)時(shí)間;適合 CRUD 密集型服務(wù)、后臺(tái)管理系統(tǒng)。
- 注意事項(xiàng):自動(dòng)生成的端點(diǎn)雖然方便,但在復(fù)雜業(yè)務(wù)(權(quán)限、校驗(yàn)、復(fù)雜邏輯)下可能需要手工調(diào)整或替換。
2.4 復(fù)雜查詢能力:動(dòng)態(tài)排序/分頁(yè)/聯(lián)表 (joins)
FastCRUD 支持以下特性:
- 自動(dòng)檢測(cè) Join 條件 (join 操作) ([GitHub][1])
- 排序 (sort_columns, sort_orders) 和分頁(yè) (offset/cursor) ([PyPI][3])
- Cursor 分頁(yè)適合“無(wú)限滾動(dòng)”場(chǎng)景。([PyPI][3])
- 優(yōu)勢(shì):相比自己手寫(xiě) select + joins + pagination,這些常見(jiàn)需求已經(jīng)封裝好。
- 注意事項(xiàng):雖然支持 join,但并不是萬(wàn)能(例如非常復(fù)雜的自定義 SQL、視圖、CTE、子查詢等可能還是需要手寫(xiě))。
2.5 模塊化 & 可擴(kuò)展設(shè)計(jì)
FastCRUD 聲稱自己是 “Modular and Extensible”。([GitHub][1])
- 意味著你可以繼承、覆蓋默認(rèn)行為(比如你想添加軟刪除字段、審計(jì)字段、特定校驗(yàn)等)。
- 對(duì)于標(biāo)準(zhǔn)化服務(wù)非常有用,但一定要看文檔/源碼以了解擴(kuò)展方式。
三、快速上手示例
下面通過(guò)一個(gè)簡(jiǎn)單的 “Items” 模型示例演示如何使用 FastCRUD。
3.1 環(huán)境準(zhǔn)備
假設(shè)你已經(jīng)安裝了:
pip install fastcrud
并且項(xiàng)目中已有 FastAPI/SQLAlchemy 2 配置。根據(jù) 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 應(yīng)用配置 & 路由自動(dòng)生成
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)
啟動(dòng)后,你就會(huì)在 /docs 中看到 CRUD 接口(例如 POST /items/, GET /items/{id}, PATCH /items/{id}, DELETE /items/{id},列表接口等)。這個(gè)省去了大量重復(fù)代碼。文章中即有示例。([Medium][2])
3.4 在自定義路由中使用
如果你需要更靈活控制,比如在路徑、邏輯、權(quán)限等方面,F(xiàn)astCRUD 也支持直接用其 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
這樣你保留了自定義控制流,同時(shí)利用其 CRUD 基礎(chǔ)邏輯。
四、深入機(jī)制剖析
4.1 CRUD 類的方法
根據(jù)文檔,F(xiàn)astCRUD 提供若干關(guān)鍵方法(摘錄自 PyPI):
create(db, object: CreateSchemaType) -> ModelTypeget(db, schema_to_select: Optional[...] = None, **kwargs)exists(db, **kwargs) -> boolcount(db, **kwargs) -> intget_multi(db, offset=0, limit=100, schema_to_select=None, sort_columns=None, sort_orders=None, return_as_model=False, **kwargs) -> dict[str, Any]update(db, object: Union[UpdateSchemaType, dict], **kwargs)delete(db, db_row=None, **kwargs)(軟刪除)db_delete(db, **kwargs)(硬刪除)
此外還有更高級(jí)如 get_joined、get_multi_joined、get_multi_by_cursor 等用于 join 和 cursor 分頁(yè)。([PyPI][3])
4.2 自動(dòng)生成 Router 的機(jī)制
crud_router 的實(shí)現(xiàn)會(huì)內(nèi)部創(chuàng)建標(biāo)準(zhǔn)的 FastAPI 路由(POST、GET、PATCH、DELETE、列表等),并且使用上面 CRUD 方法作為 handler。它還接受 session factory、model、schema、path、tags 等參數(shù)。通過(guò)這層抽象,開(kāi)發(fā)者并不需要每次手動(dòng)寫(xiě)路由定義。
4.3 Pagination & Sorting
- Offset 分頁(yè):通過(guò)
offset+limit參數(shù)在get_multi方法中支持。 - Cursor 分頁(yè):通過(guò)
get_multi_by_cursor支持,該方法接受cursor,limit,sort_column,sort_order參數(shù)。 - Sorting:可以傳入
sort_columns和sort_orders對(duì)應(yīng)列與方向。
這些都是常見(jiàn)但自己手寫(xiě)較繁瑣的邏輯,使用 FastCRUD 可以省掉不少代碼。
4.4 Join 支持
get_joined 與 get_multi_joined 方法支持將主模型與其它模型做關(guān)聯(lián)查詢。對(duì)于 ORM 模型間關(guān)系(ForeignKey、relationship)或顯式 join_on 條件,F(xiàn)astCRUD 支持自動(dòng)檢測(cè) join 條件。([GitHub][1]) 不過(guò),這里也有“隱藏成本”——如果你的 join 邏輯非常定制(如多級(jí) join、復(fù)雜子查詢、聚合等),仍可能需要手寫(xiě) SQL。
五、優(yōu)點(diǎn) & 使用場(chǎng)景
優(yōu)點(diǎn)
- 開(kāi)發(fā)效率高:特別是內(nèi)部后臺(tái)服務(wù)、CRUD 為主的 API,可以快速上線。
- 代碼統(tǒng)一:CRUD 操作集中到類庫(kù)里,減少重復(fù) Boilerplate。
- 現(xiàn)代技術(shù)棧支持:異步、SQLAlchemy 2.0、Pydantic 2.x、FastAPI。
- 可擴(kuò)展:可以在標(biāo)準(zhǔn)之上加入自定義邏輯。
- 自動(dòng)路由生成:適合快速原型或內(nèi)部工具。
使用場(chǎng)景
- 企業(yè)內(nèi)部后臺(tái)管理系統(tǒng)(如用戶、權(quán)限、產(chǎn)品、訂單管理)
- 微服務(wù)中 CRUD 密集但業(yè)務(wù)邏輯相對(duì)簡(jiǎn)單的場(chǎng)景
- 快速原型驗(yàn)證,尤其想用 FastAPI 很快搭建接口
- 想統(tǒng)一標(biāo)準(zhǔn) CRUD 模型、減少重復(fù)代碼的團(tuán)隊(duì)
六、局限性 &注意事項(xiàng)
局限性
- 復(fù)雜業(yè)務(wù)邏輯的靈活性:當(dāng)業(yè)務(wù)流程包含大量自定義校驗(yàn)、復(fù)雜事務(wù)、跨模型操作、子查詢/聚合時(shí),自動(dòng)生成的 CRUD 路徑可能不夠,需要手寫(xiě)或擴(kuò)展。
- ORM 歷史或依賴限制:如果項(xiàng)目仍在用 SQLAlchemy 1.x 或者不同 ORM(如 Tortoise ORM、ORMlite)則不適用。
- 文檔或社區(qū)投入:雖然有基本文檔,但相比成熟框架/庫(kù),可能在邊緣場(chǎng)景(例如非常復(fù)雜 join、特殊數(shù)據(jù)庫(kù)類型)支持較少。Reddit 上就有用戶反饋文檔在 “why use this” 和 “how exactly generated endpoints look” 方面資料不夠詳盡。([Reddit][4])
- 自動(dòng)化可能隱藏細(xì)節(jié):自動(dòng) endpoint 雖然方便,但你可能不清楚默認(rèn)行為(如軟刪除、異常處理、返回格式)細(xì)節(jié)。建議在生產(chǎn)環(huán)境使用前明確行為。
注意事項(xiàng)
- 確保數(shù)據(jù)模型設(shè)計(jì)良好(主鍵、關(guān)系、索引、外鍵等清晰),以便 join 機(jī)制能順利工作。
- 如果數(shù)據(jù)庫(kù)字段類型比較特殊(例如使用
sqlalchemy-utils的特殊列類型),F(xiàn)astCRUD 文檔中提到可能會(huì)拋出NotImplementedError,需要你為該列類型添加python_type屬性。([GitHub][1]) - 在使用
crud_router生成路由時(shí),默認(rèn)假設(shè)主鍵字段名為id(至少在某些版本中如此)——根據(jù) PyPI 描述:“For now, your primary column must be namedidor automatic endpoint creation will not work.” ([PyPI][3]) - 生產(chǎn)環(huán)境中,建議你對(duì)生成的端點(diǎn)加入權(quán)限驗(yàn)證、訪問(wèn)日志、異常統(tǒng)一處理等中間件,而不僅僅依賴自動(dòng)路由。
- 針對(duì)分頁(yè)/排序/過(guò)濾的安全考慮(如防止 offset 太大、cursor 被濫用、排序字段注入等)也要做好防護(hù)。
七、實(shí)戰(zhàn)建議與最佳實(shí)踐
- 從原型階段開(kāi)始使用自動(dòng) router:在項(xiàng)目初期快速搭建 CRUD 路由,驗(yàn)證業(yè)務(wù)模型、前端交互、數(shù)據(jù)結(jié)構(gòu)。
- 根據(jù)需求分層使用:對(duì)于標(biāo)準(zhǔn) CRUD 模型(如很多后臺(tái)表格接口),使用
crud_router;對(duì)于需要復(fù)雜邏輯/權(quán)限控制的路由,使用FastCRUD類結(jié)合自定義邏輯。 - 注重 schema 與模型分離:仍然建議你定義清晰的 Pydantic schema(Create/Update/Read),規(guī)范輸入輸出;避免直接暴露 ORM 模型。
- 做好分頁(yè)、排序、過(guò)濾標(biāo)準(zhǔn):即便庫(kù)封裝好了,也建議在文檔中明確你的分頁(yè)策略、最大限制、默認(rèn)排序。
- 審查自動(dòng)生成的路由:仔細(xì)查看自動(dòng)生成的路徑、方法、返回類型、異常處理,確保滿足你團(tuán)隊(duì)合同/API規(guī)范。
- 避免過(guò)早升級(jí):雖然庫(kù)支持 SQLAlchemy 2.0,但如果你的項(xiàng)目還在使用 1.x,最好先評(píng)估升級(jí)影響。
- 關(guān)注社區(qū)與維護(hù)狀態(tài):雖然目前版本可用(截至 2024 年初發(fā)布 0.1.4)([PyPI][3]),但生產(chǎn)環(huán)境應(yīng)監(jiān)控庫(kù)更新、issue 響應(yīng)情況、社區(qū)反饋。
八、總結(jié)
FastCRUD 是一個(gè)非常實(shí)用的工具,尤其適合你希望用 FastAPI 快速搭建 CRUD 接口、減少重復(fù)代碼、聚焦核心業(yè)務(wù)邏輯的場(chǎng)景。它通過(guò)全異步支持、SQLAlchemy 2.0、自動(dòng)路由生成、分頁(yè)排序 join 支持等特性,實(shí)現(xiàn)了 “少寫(xiě)代碼、快上線” 的目標(biāo)。但同時(shí),它并不是萬(wàn)能——對(duì)于復(fù)雜業(yè)務(wù)、深度定制、非標(biāo)準(zhǔn)模型或者非 SQLAlchemy ORM 環(huán)境,仍需謹(jǐn)慎使用。
在未來(lái),如果你的項(xiàng)目方向是構(gòu)建一個(gè)標(biāo)準(zhǔn)化、可維護(hù)、高效的后端服務(wù),F(xiàn)astCRUD 可以作為一個(gè)優(yōu)秀的 “CRUD 基礎(chǔ)層”。你可以把它作為 標(biāo)準(zhǔn) CRUD 模型生成器 + 自定義邏輯插件層,形成 “自動(dòng)化 + 可擴(kuò)展” 的架構(gòu)。
以上就是Python使用FastAPI+FastCRUD自動(dòng)生成API接口的實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于Python FastAPI+FastCRUD生成API接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)抓取網(wǎng)頁(yè)生成Excel文件的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)抓取網(wǎng)頁(yè)生成Excel文件的方法,涉及PyQuery模塊的使用及Excel文件相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
python獲取引用對(duì)象的個(gè)數(shù)方式
今天小編就為大家分享一篇python獲取引用對(duì)象的個(gè)數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
PyTorch?Tensor創(chuàng)建實(shí)現(xiàn)
本文主要介紹了PyTorch?Tensor創(chuàng)建實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例
這篇文章主要介紹了keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
使用Python和Flask編寫(xiě)一個(gè)留言簿
本文將通過(guò)創(chuàng)建一個(gè)簡(jiǎn)單的留言簿應(yīng)用來(lái)入門(mén)Flask,這個(gè)項(xiàng)目可以幫助我們理解Flask的基本概念和功能,如路由、模板、表單處理等,感興趣的可以了解下2024-12-12
python opencv實(shí)現(xiàn)直線檢測(cè)并測(cè)出傾斜角度(附源碼+注釋)
這篇文章主要介紹了python opencv實(shí)現(xiàn)直線檢測(cè)并測(cè)出傾斜角度(附源碼+注釋),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
從列表或字典創(chuàng)建Pandas的DataFrame對(duì)象的方法
這篇文章主要介紹了從列表或字典創(chuàng)建Pandas的DataFrame對(duì)象的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理
這篇文章主要介紹了python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04

