【FastAPI】使用 SQLAlchemy 和 FastAPI 实现 PostgreSQL 中的 JSON 数据 CRUD 操作

news/2024/9/29 14:11:14/

在现代 web 开发中,处理 JSON 数据变得越来越普遍。本文将指导你如何使用 FastAPI 和 SQLAlchemy 实现对 PostgreSQL 数据库中 JSON 数据的增删改查(CRUD)操作。

环境准备

首先,确保你已经安装了所需的库。在终端中运行以下命令:

pip install fastapi[all] sqlalchemy psycopg2

这些库分别用于构建 API、与数据库交互以及 PostgreSQL 的连接。

项目结构

在开始之前,建议按照以下结构组织你的项目:

my_project/
│
├── main.py        # FastAPI 应用
└── models.py      # 数据库模型
1. 创建数据库模型

models.py 中定义我们的数据库模型。我们将使用 SQLAlchemy 来创建与 PostgreSQL 的连接。

from sqlalchemy import create_engine, Column, Integer, String, JSON
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmakerDATABASE_URL = "postgresql://user:password@localhost/dbname"Base = declarative_base()
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)class Item(Base):__tablename__ = 'items'id = Column(Integer, primary_key=True, index=True)name = Column(String, index=True)data = Column(JSON)# 创建表
Base.metadata.create_all(bind=engine)

在这里,我们定义了一个 Item 类,包含 idnamedata 字段,其中 data 字段将用于存储 JSON 数据。

2. 创建 FastAPI 应用

接下来,在 main.py 中构建 FastAPI 应用并实现 CRUD 操作。

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from models import SessionLocal, Itemapp = FastAPI()# 创建数据库会话依赖
def get_db():db = SessionLocal()try:yield dbfinally:db.close()# 创建项目
@app.post("/items/", response_model=Item)
def create_item(item: Item, db: Session = Depends(get_db)):db.add(item)db.commit()db.refresh(item)return item# 获取项目
@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: int, db: Session = Depends(get_db)):item = db.query(Item).filter(Item.id == item_id).first()if item is None:raise HTTPException(status_code=404, detail="Item not found")return item# 更新项目
@app.put("/items/{item_id}", response_model=Item)
def update_item(item_id: int, item: Item, db: Session = Depends(get_db)):db_item = db.query(Item).filter(Item.id == item_id).first()if db_item is None:raise HTTPException(status_code=404, detail="Item not found")db_item.name = item.namedb_item.data = item.datadb.commit()db.refresh(db_item)return db_item# 删除项目
@app.delete("/items/{item_id}", response_model=Item)
def delete_item(item_id: int, db: Session = Depends(get_db)):item = db.query(Item).filter(Item.id == item_id).first()if item is None:raise HTTPException(status_code=404, detail="Item not found")db.delete(item)db.commit()return item

在这个应用中,我们定义了四个主要的路由,分别用于创建、读取、更新和删除项目。

3. 运行应用

在终端中运行以下命令启动 FastAPI 应用:

uvicorn main:app --reload

应用启动后,你可以访问 http://127.0.0.1:8000/docs 查看自动生成的 API 文档,并进行测试。

4. 测试 API

你可以使用 Postman 或 curl 测试 API 操作,例如:

  • 创建项目
curl -X POST "http://127.0.0.1:8000/items/" -H "Content-Type: application/json" -d '{"name": "item1", "data": {"key": "value"}}'
  • 获取项目
curl -X GET "http://127.0.0.1:8000/items/1"
  • 更新项目
curl -X PUT "http://127.0.0.1:8000/items/1" -H "Content-Type: application/json" -d '{"name": "item1_updated", "data": {"key": "new_value"}}'
  • 删除项目
curl -X DELETE "http://127.0.0.1:8000/items/1"
结论

通过以上步骤,你可以使用 FastAPI 和 SQLAlchemy 实现对 PostgreSQL 中 JSON 数据的增删改查操作。这种组合不仅能提供高性能的 API 体验,还能方便地处理复杂的数据结构。

希望这篇博客对你在项目中实现 CRUD 操作有所帮助!如果你有任何问题或想法,欢迎在评论区留言讨论。


http://www.ppmy.cn/news/1531946.html

相关文章

RPA助力企业办公流程自动化:真实应用案例展示

在当今快速变化的商业环境中,企业面临着前所未有的挑战和机遇。数字化转型已成为企业提升竞争力、优化运营效率和增强客户体验的关键策略。RPA数字员工作为这一转型过程中的重要工具,正在帮助企业实现办公流程的自动化,从而加速数字化转型的步…

node后端react前端简单实例

安装node mkdir my-node-server cd my-node-server npm init -y npm install express cors 创建 server.js文件 const express require(express); const cors require(cors); const app express(); const PORT 4000; app.use(cors()); // 允许跨域请求 app.get(/api…

[java][git]git学习

Git 什么是Git? Git是一款源代码管理工具(版本控制工具) 我们写的代码需要使用Git进行管理。 源代码有必要管理起吗?1.02.0 //svn,vss,vcs… git有必要,因为人工的去处理不同的版本,做相应备份会很麻烦。Git是linux之父当年为了维护linux—…

浅谈C++之线程管理

一、基本介绍 C11 提供了强大的多线程支持,涵盖了线程的创建、同步、共享数据管理等,极大简化了多线程编程的复杂性。 线程:一个程序执行流的最小单位。每个线程都有自己的程序计数器、栈、寄存器等。多线程:程序可以同时执行多个…

JIT(Just-In-Time)

JIT(Just-In-Time)即时编译是一种在程序运行时动态编译字节码为机器码的技术,常用于提高代码执行效率。它结合了解释型语言的灵活性与编译型语言的高效性。 JIT 的工作原理 字节码执行:JIT 编译器首先会以字节码的形式执行代码&…

BERT训练环节(代码实现)

1.代码实现 #导包 import torch from torch import nn import dltools #加载数据需要用到的声明变量 batch_size, max_len 1, 64 #获取训练数据迭代器、词汇表 train_iter, vocab dltools.load_data_wiki(batch_size, max_len) #其余都是二维数组 #tokens, segments, vali…

WPF DataGridTextColumn 时间列格式设置

WPF DataGridTextColumn 时间列格式设置 可以使用 Binding.StringFormat 来进行设置&#xff1a; <DataGridTextColumn Header"记录时间" Binding"{Binding ErrTime,StringFormatyyyy年MM月dd日 HH:mm:ss}"></DataGridTextColumn>

CentOS 替换 yum源 经验分享

视频教程在bilibili:CentOS 替换 yum源 经验分享_哔哩哔哩_bilibili问题原因 解决方法 1. 进入镜像目录 [rootlocalhost ~]# cd /etc/yum.repos.d/ 2.备份文件 [rootlocalhost yum.repos.d]# rename repo bak * 3.寻找阿里镜像源复制 https://developer.aliyun.com/mirror/ …