当前位置: 首页 > news >正文

FastAPI + SQLModel 从 0 搭到完整 CRUD

FastAPI + SQLModel 从 0 搭到完整 CRUD

1. 安装依赖

python -m venv venv && source venv/bin/activate  # 可选
pip install "fastapi[standard]" sqlmodel

2. 目录结构(单文件也 OK)

project
├── main.py
└── models.py

3. 定义模型 models.py

from typing import Optional
from sqlmodel import SQLModel, Fieldclass Hero(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)name: strage: Optional[int] = None

4. 完整 main.py(含库初始化 + CRUD)

from fastapi import FastAPI, Depends, HTTPException
from sqlmodel import Session, create_engine, select
from models import Hero, SQLModelDATABASE_URL = "sqlite:///./hero.db"
engine = create_engine(DATABASE_URL, echo=True)# 启动时自动建表
def create_db_and_tables():SQLModel.metadata.create_all(engine)def get_session():with Session(engine) as session:yield sessionapp = FastAPI()@app.on_event("startup")
def on_startup():create_db_and_tables()# 新增英雄
@app.post("/heroes/", response_model=Hero)
def create_hero(hero: Hero, db: Session = Depends(get_session)):db.add(hero)db.commit()db.refresh(hero)return hero# 查询全部
@app.get("/heroes/", response_model=list[Hero])
def read_heroes(db: Session = Depends(get_session)):return db.exec(select(Hero)).all()# 查询单个
@app.get("/heroes/{hero_id}", response_model=Hero)
def read_hero(hero_id: int, db: Session = Depends(get_session)):hero = db.get(Hero, hero_id)if not hero:raise HTTPException(status_code=404, detail="Hero not found")return hero# 更新
@app.put("/heroes/{hero_id}", response_model=Hero)
def update_hero(hero_id: int, updated: Hero, db: Session = Depends(get_session)):hero = db.get(Hero, hero_id)if not hero:raise HTTPException(status_code=404, detail="Hero not found")for k, v in updated.dict(exclude_unset=True).items():setattr(hero, k, v)db.commit()db.refresh(hero)return hero# 删除
@app.delete("/heroes/{hero_id}")
def delete_hero(hero_id: int, db: Session = Depends(get_session)):hero = db.get(Hero, hero_id)if not hero:raise HTTPException(status_code=404, detail="Hero not found")db.delete(hero)db.commit()return {"ok": True}

5. 启动 & 测试

fastapi dev main.py --reload
# 或用 uvicorn main:app --reload

浏览器打开 http://127.0.0.1:8000/docs 即可看到自动生成的 Swagger UI,点点鼠标就能完成增删改查

6. 想换 PostgreSQL?

把 DATABASE_URL 改成
postgresql://user:pwd@localhost:5432/dbname
并额外安装 pip install psycopg2-binary 即可,其余代码零改动
http://www.dtcms.com/a/353155.html

相关文章:

  • 腾讯云人脸库技术架构深度解析
  • Github 3k+ star,中后台管理系统框架,支持多款 UI 组件库,兼容PC、移动端!比商业系统还专业!!
  • IntelliJ IDEA Debug 模式功能指南
  • 微算法科技(NASDAQ:MLGO)突破性FPGA仿真算法技术助力Grover搜索,显著提升量子计算仿真效率
  • 【数据结构】树和二叉树——树和森林
  • Python音频分析与线性回归:探索声音中的数学之美
  • 基于 Qt 实现的动态流程图画板框架设计与实现
  • 储能变流器学习之MPPT
  • 教程:按年份导出中国县级 NDVI(月均值 CSV)
  • 【87页PPT】新能源汽车解决方案(附下载方式)
  • 把 AI 塞进「盲文点显器」——基于触觉反馈的离线双向翻译笔
  • 【RAG】使用llamaindex进行RAG开发
  • 【前端】Devtools使用
  • 日志输出触发的死锁问题排查记录
  • Android 中 spinner / AppCompatSpinner 文字颜色 和 显示样式 源码分析
  • 如何轻松地将数据从安卓设备传输到安卓设备
  • 构建AI智能体:十五、超越关键词搜索:向量数据库如何解锁语义理解新纪元
  • 使用 html2canvas + jspdf 实现页面元素下载为pdf文件
  • Transformer 模型在自动语音识别(ASR)中的应用
  • 华为L420国产笔记本(统信UOS桌面专业版1070)安装openEuler2403虚拟机
  • 基于Spring Boot的民宿服务管理系统-项目分享
  • Python 并行计算进阶:ProcessPoolExecutor 处理 CPU 密集型任务
  • Java设计模式之《外观模式》
  • 广东省省考备考(第八十八天8.27)——判断推理(第八节课)
  • 31. 什么是字符串常量池
  • 2025.8.27链表_链表逆置
  • 【Python-1】字符串连接方式“+“和“,”的区别
  • AI + 旅游 = 应用案例分析(一)
  • TDengine IDMP 5 个实测场景让监控变简单
  • 【和春笋一起学C++】(三十七)类的析构函数