当前位置: 首页 > 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.xdnf.cn/news/1373743.html

相关文章:

  • STL库——vector(类模拟实现)
  • skywalking 原理
  • 当AI有了温度,三星正在重新定义生活的边界
  • 技术分析 | Parasoft C/C++test如何突破单元测试的隔离难题
  • SyntaxError: Failed to execute ‘open‘ on ‘XMLHttpRequest‘: Invalid URL
  • 【C++】set 容器的使用
  • Android/Java中枚举的详解
  • 基于Spring Boot+Vue的生活用品购物平台/在线购物系统/生活用户在线销售系统/基于javaweb的在线商城系统
  • JMeter —— 压力测试
  • 基于 Docker Compose 的若依多服务一键部署java项目实践
  • C# OpenCVSharp 实现物体尺寸测量方案
  • 【Java】异常处理:从入门到精通
  • npm run start 的整个过程
  • 文字样式设置
  • Python基础、数据科学入门NumPy(数值计算)、Pandas(数据处理)、Matplotlib(数据可视化)附视频教程
  • 使用Spring Boot和EasyExcel导出Excel文件,并在前端使用Axios进行请求
  • 部署网页在服务器(公网)上笔记 infinityfree 写一个找工作单html文件的网站
  • 趣味学Rust基础篇(变量与可变性)
  • 从传统到创新:用报表插件重塑数据分析平台
  • 基于Spark的白酒行业数据分析与可视化系统的设计与实现
  • 【服务器】用X99主板组装服务器注意事项
  • 【开题答辩全过程】以 微信小程序的医院挂号预约系统为例,包含答辩的问题和答案
  • 在Excel和WPS表格中通过查找替换对单元格批量强制换行
  • 实现基于数据库 flag 状态的消息消费控制
  • PMP项目管理知识点-⑭【①-⑬流程总结】→图片直观表示
  • 让ai写一个类github首页
  • 从文本到二进制:HTTP/2不止于性能,更是对HTTP/1核心语义的传承与革新
  • 深度学习11 Deep Reinforcement Learning
  • 深度学习12 Reinforcement Learning with Human Feedback
  • 如何在阿里云百炼中使用钉钉MCP