最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用FastAPI+FastCRUD自動(dòng)生成API接口的實(shí)現(xiàn)

 更新時(shí)間:2025年11月13日 09:20:25   作者:Java私教  
FastCRUD 是一個(gè)為 FastAPI + SQLAlchemy 場(chǎng)景設(shè)計(jì)的開(kāi)源庫(kù),由 Benav Labs 維護(hù),旨在簡(jiǎn)化 CRUD 端點(diǎn)搭建與數(shù)據(jù)庫(kù)操作的流程,本文呢給大家介紹了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) -> ModelType
  • get(db, schema_to_select: Optional[...] = None, **kwargs)
  • exists(db, **kwargs) -> bool
  • count(db, **kwargs) -> int
  • get_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_columnssort_orders 對(duì)應(yīng)列與方向。

這些都是常見(jiàn)但自己手寫(xiě)較繁瑣的邏輯,使用 FastCRUD 可以省掉不少代碼。

4.4 Join 支持

get_joinedget_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 named id or 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文件的方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)抓取網(wǎng)頁(yè)生成Excel文件的方法,涉及PyQuery模塊的使用及Excel文件相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Python中str.join()簡(jiǎn)單用法示例

    Python中str.join()簡(jiǎn)單用法示例

    這篇文章主要介紹了Python中str.join()簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Python中str.join()用于連接生成新字符串的相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • python獲取引用對(duì)象的個(gè)數(shù)方式

    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)

    本文主要介紹了PyTorch?Tensor創(chuàng)建實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Python類的繼承super相關(guān)原理解析

    Python類的繼承super相關(guān)原理解析

    這篇文章主要介紹了Python類的繼承super相關(guān)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • keras的siamese(孿生網(wǎng)絡(luò))實(shí)現(xiàn)案例

    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è)留言簿

    使用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è)出傾斜角度(附源碼+注釋)

    這篇文章主要介紹了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ì)象的方法

    這篇文章主要介紹了從列表或字典創(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é)處理

    這篇文章主要介紹了python數(shù)字圖像處理之高級(jí)形態(tài)學(xué)處理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04

最新評(píng)論

平湖市| 郴州市| 泸州市| 临西县| 珲春市| 旺苍县| 绥中县| 庆元县| 上蔡县| 郁南县| 古丈县| 渑池县| 洛隆县| 凌云县| 合川市| 甘孜县| 梁平县| 盱眙县| 当阳市| 桓台县| 静安区| 扬中市| 景东| 江孜县| 桂东县| 紫云| 西林县| 吴江市| 银川市| 雅江县| 文安县| 晋宁县| 长乐市| 策勒县| 积石山| 武宣县| 西安市| 驻马店市| 疏勒县| 西峡县| 宁明县|