FastAPI 與數據庫交互示例

目錄

    • 安裝必要的包
    • 完整代碼示例
    • 運行應用
    • 使用說明
    • API 端點說明
    • 代碼解析

下面將創建一個簡單的 FastAPI 應用程序,演示如何與 SQLite 數據庫進行交互。這個例子包括創建、讀取、更新和刪除(CRUD)操作。

安裝必要的包

首先,需要安裝以下包:

pip install fastapi uvicorn sqlalchemy pydantic

完整代碼示例

from fastapi import FastAPI, HTTPException, Depends, status
from sqlalchemy import create_engine, Column, Integer, String, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session
from pydantic import BaseModel
from typing import List, Optional# 創建 FastAPI 應用
app = FastAPI(title="任務管理API")# 數據庫配置
SQLALCHEMY_DATABASE_URL = "sqlite:///./tasks.db"
engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()# 定義數據庫模型
class TaskModel(Base):__tablename__ = "tasks"id = Column(Integer, primary_key=True, index=True)title = Column(String, index=True)description = Column(String)completed = Column(Boolean, default=False)# 創建數據庫表
Base.metadata.create_all(bind=engine)# 定義 Pydantic 模型用于請求和響應
class TaskBase(BaseModel):title: strdescription: Optional[str] = Nonecompleted: bool = Falseclass TaskCreate(TaskBase):passclass Task(TaskBase):id: intclass Config:orm_mode = True# 依賴項:獲取數據庫會話
def get_db():db = SessionLocal()try:yield dbfinally:db.close()# API 路由
@app.post("/tasks/", response_model=Task, status_code=status.HTTP_201_CREATED)
def create_task(task: TaskCreate, db: Session = Depends(get_db)):db_task = TaskModel(**task.dict())db.add(db_task)db.commit()db.refresh(db_task)return db_task@app.get("/tasks/", response_model=List[Task])
def read_tasks(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):tasks = db.query(TaskModel).offset(skip).limit(limit).all()return tasks@app.get("/tasks/{task_id}", response_model=Task)
def read_task(task_id: int, db: Session = Depends(get_db)):task = db.query(TaskModel).filter(TaskModel.id == task_id).first()if task is None:raise HTTPException(status_code=404, detail="任務未找到")return task@app.put("/tasks/{task_id}", response_model=Task)
def update_task(task_id: int, task: TaskCreate, db: Session = Depends(get_db)):db_task = db.query(TaskModel).filter(TaskModel.id == task_id).first()if db_task is None:raise HTTPException(status_code=404, detail="任務未找到")for key, value in task.dict().items():setattr(db_task, key, value)db.commit()db.refresh(db_task)return db_task@app.delete("/tasks/{task_id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_task(task_id: int, db: Session = Depends(get_db)):db_task = db.query(TaskModel).filter(TaskModel.id == task_id).first()if db_task is None:raise HTTPException(status_code=404, detail="任務未找到")db.delete(db_task)db.commit()return None# 如果直接運行此文件,啟動服務器
if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

運行應用

保存上面的代碼后,可以通過以下命令運行應用:

uvicorn fastapi_sql:app --reload

或者直接運行 Python 文件:

python fastapi_sql.py

使用說明

  1. 啟動應用后,訪問 http://127.0.0.1:8000/docs 可以看到自動生成的 Swagger UI 文檔
  2. 通過這個界面可以測試所有的 API 端點
    在這里插入圖片描述

在這里插入圖片描述

API 端點說明

  • POST /tasks/ - 創建新任務
  • GET /tasks/ - 獲取所有任務列表
  • GET /tasks/{task_id} - 獲取特定任務詳情
  • PUT /tasks/{task_id} - 更新特定任務
  • DELETE /tasks/{task_id} - 刪除特定任務

代碼解析

  1. 數據庫設置

    • 使用 SQLAlchemy ORM 連接 SQLite 數據庫
    • 創建數據庫模型 TaskModel 定義表結構
  2. Pydantic 模型

    • 使用 Pydantic 定義數據驗證和序列化模型
    • TaskBase 包含基本字段
    • TaskCreate 用于創建請求
    • Task 包含 ID,用于響應
  3. 依賴注入

    • 使用 Depends 注入數據庫會話
    • 確保會話在請求結束后正確關閉
  4. CRUD 操作

    • 實現了完整的增刪改查功能
    • 包含適當的錯誤處理和狀態碼

這個例子展示了 FastAPI 與 SQLAlchemy 的集成,適用于大多數數據庫交互場景。如需使用其他數據庫(如 MySQL、PostgreSQL),只需更改連接字符串和相應的驅動程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81350.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81350.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81350.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLO旋轉目標檢測之ONNX模型推理

YOLO旋轉檢測相較于目標檢測而言,其只是最后的輸出層網絡發生了改變,一個最明顯的區別便是:目標檢測的檢測框是xywh,而旋轉檢測則為xywha,其中,這個a代表angle,即旋轉角度,其余的基本…

架構進階:深入學習企業總體架構規劃(Oracle 戰略專家培訓課件)【附全文閱讀】

本文主要討論了企業總體技術架構規劃的重要性與實施建議。針對Oracle戰略專家培訓課件中的內容,文章強調了行業面臨的挑戰及現狀分析、總體技術架構探討、SOA集成解決方案討論與問題解答等方面。文章指出,為了消除信息孤島、強化應用系統,需要…

llamafactory-cli webui啟動報錯TypeError: argument of type ‘bool‘ is not iterable

一、問題 在阿里云NoteBook上啟動llamafactory-cli webui報錯TypeError: argument of type ‘bool’ is not iterable This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run gradio deploy from the terminal in the working directory t…

Gas 優化不足、升級機制缺陷問題

以下是針對智能合約中 Gas 優化不足 與 升級機制缺陷 的技術風險分析與解決方案: 一、Gas 優化不足 1. 核心問題 Gas 優化不足會導致合約執行成本過高,直接影響用戶體驗和協議可行性,尤其在交易高峰期可能引發鏈上擁堵或交易失敗。 2. 常見風險點 冗余計算與存儲操作 例如…

使用xlwings計算合并單元格的求和

有如下一個excel表 表內有合并單元格,現在需要求和,不能直接下拉填充公式怎么辦? 通常的辦法是先取消合并單元格,計算后,再次合并單元格,比較繁瑣。 在此,嘗試使用python和xlwings運行直接給出…

[創業之路-354]:農業文明到智能紀元:四次工業革命下的人類遷徙與價值重構

農業文明到智能紀元:四次工業革命下的人類遷徙與價值重構 從游牧到定居,從蒸汽轟鳴到算法洪流,人類文明的每一次跨越都伴隨著生產關系的劇烈震蕩。四次工業革命的浪潮不僅重塑了物質世界的生產方式,更將人類推向了身份認同與存在…

LeetCode 2302.統計得分小于 K 的子數組數目:滑動窗口(不需要前綴和)

【LetMeFly】2302.統計得分小于 K 的子數組數目:滑動窗口(不需要前綴和) 力扣題目鏈接:https://leetcode.cn/problems/count-subarrays-with-score-less-than-k/ 一個數組的 分數 定義為數組之和 乘以 數組的長度。 比方說&…

kafka學習筆記(四、生產者(客戶端)深入研究(二)——消費者協調器與_consumer_offsets剖析)

1.消費者協調器和組協調器 如果消費者客戶端中配置了多個分配策略,則多消費者的分區分配交由消費者協調器和組協調器來完成,他們之間使用一套組協調協議進行交互。 1.1.在均衡原理 將全部消費者分成多個子集,每個消費者組的子集在服務中對…

快速將FastAPI接口轉為模型上下文協議(MCP)!

fastapi_mcp 是一個用于將 FastAPI 端點暴露為模型上下文協議(Model Context Protocol, MCP)工具的庫,并且支持認證功能。 環境macbook,python3.13 pip install fastapi uvicorn fastapi-mcp 代碼 from fastapi import FastAPI, …

實驗數據的轉換

最近做實驗需要把x軸y軸z軸的數據處理一下,總結一下解決的方法: 源文件為兩個txt文檔,分別為x軸和y軸,如下: 最終需要達到的效果是如下: 就是需要把各個矩陣的數據整理好放在同一個txt文檔里。 步驟① …

第Y3周:yolov5s.yaml文件解讀

🍨 本文為🔗365天深度學習訓練營 中的學習記錄博客🍖 原作者:K同學啊 本次任務:將yolov5s網絡模型中的第4層的C3x2修改為C3x1,第6層的C3x3修改為C3x2。 首先輸出原來的網絡結構: from n pa…

Ansible安裝配置

一、前提 服務器操作系統均為centos7.9 主機ipmaster(Ansible管理端)172.25.192.2node1172.25.192.10node2172.25.192.3 更新/etc/hosts文件 二、安裝 master節點: 1. 安裝epel源 yum install -y epel-release 2. 安裝Ansible yum install -y ansible A…

MySQL中ROW_NUMBER() OVER的用法以及使用場景

使用語法 ROW_NUMBER() OVER ([PARTITION BY partition_column1, partition_column2, ...]ORDER BY sort_column1 [ASC|DESC], sort_column2 [ASC|DESC], ... )PARTITION BY:將數據按指定列分組,每組內單獨生成行號。ORDER BY:決定組內行號的…

【人工智能】釋放本地AI潛能:LM Studio用戶腳本自動化DeepSeek的實戰指南

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著大型語言模型(LLM)的快速發展,DeepSeek以其高效的性能和開源特性成為開發者關注的焦點。LM Studio作為一款強大的本地AI模型管理工具…

筆試強訓:Day3

一、牛牛沖鉆五&#xff08;模擬&#xff09; 登錄—專業IT筆試面試備考平臺_牛客網 #include<iostream> using namespace std; int main(){int t,n,k;string s;cin>>t;while(t--){cin>>n>>k>>s;int ret0;//統計加了多少星for(int i0;i<n;i)…

語音識別質量的跟蹤

背景 這個項目是用來生成結構化的電子病歷的。數據的來源是醫生的錄音。中間有一大堆的處理&#xff0c;語音識別&#xff0c;關鍵字匹配&#xff0c;結構化處理&#xff0c;病歷編輯......。最多的時候給上百家醫院服務。 語音識別質量的跟蹤 一、0225醫院的訓練后的情況分…

人工智能搜索時代的SEO:關鍵趨勢與優化策略

隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;搜索引擎的運作方式正在經歷前所未有的變革。2025年&#xff0c;AI驅動的搜索&#xff08;如谷歌的AI概覽、ChatGPT搜索和必應的AI增強功能&#xff09;不僅改變了用戶獲取信息的方式&#xff0c;還為SEO從業…

Node.js心得筆記

npm init 可用npm 來調試node項目 瀏覽器中的頂級對象時window <ref *1> Object [global] { global: [Circular *1], clearImmediate: [Function: clearImmediate], setImmediate: [Function: setImmediate] { [Symbol(nodejs.util.promisify.custom)]: [Getter] }, cl…

計算機網絡01-網站數據傳輸過程

局域網&#xff1a; 覆蓋范圍小&#xff0c;自己花錢買設備&#xff0c;寬帶固定&#xff0c;自己維護&#xff0c;&#xff0c;一般長度不超過100米&#xff0c;&#xff0c;&#xff0c;帶寬也比較固定&#xff0c;&#xff0c;&#xff0c;10M&#xff0c;&#xff0c;&…

Mysql常用函數解析

字符串函數 CONCAT(str1, str2, …) 將多個字符串連接成一個字符串。 SELECT CONCAT(Hello, , World); -- 輸出: Hello World??SUBSTRING(str, start, length) 截取字符串的子串&#xff08;起始位置從1開始&#xff09;。 SELECT SUBSTRING(MySQL, 3, 2); -- 輸出: SQ…