FastAPI +postgres的增删改查

引言

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建基于标准 Python 类型注解的 API。它支持异步处理请求,并与 Pydantic 和 Starlette 等库紧密集成,提供了强大的功能。PostgreSQL 是一个功能强大的开源对象-关系型数据库系统,以其稳定性、可扩展性和安全性而闻名。结合这两者,我们可以快速开发出高性能的 Web 服务。

环境准备

在开始之前,请确保你已经安装了以下依赖:

 pip install fastapipip install sqlalchemypip install psycopg2-binary  # PostgreSQL 数据库适配器pip install pydantic

创建数据库模型

使用 SQLAlchemy 定义一个简单的数据库模型:

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
 
DATABASE_URL = "postgresql://user:password@localhost:5432/mydatabase"
 
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
 
Base = declarative_base()
 
class Item(Base):
  __tablename__ = "items"
  id = Column(Integer, primary_key=True, index=True)
  name = 
### 使用 FastAPI 编写与 Postgres 数据库进行交互的 CRUD 接口 #### 1. 安装依赖项 为了使 FastAPI 能够连接并操作 PostgreSQL 数据库,需要安装 `fastapi`、`uvicorn` 和 `sqlalchemy` 等必要的 Python 包。 ```bash pip install fastapi uvicorn sqlalchemy asyncpg databases ``` 这些包提供了构建 Web API 所需的核心功能以及异步数据库访问的支持[^1]。 #### 2. 配置数据库连接 创建一个新的文件来配置数据库设置。这通常涉及定义数据库 URL 并初始化 SQLAlchemy 的引擎实例。 ```python from databases import Database from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker import os DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname" database = Database(DATABASE_URL) Base = declarative_base() SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close() ``` 这段代码片段展示了如何建立到 PostgreSQL 数据库的安全连接,并准备了一个会话管理器以便后续查询使用。 #### 3. 创建数据模型 通过继承自 `Base` 类的方式定义 ORM 模型类,从而映射表结构至 Python 对象上。 ```python from sqlalchemy import Column, Integer, String, Float, ForeignKey from sqlalchemy.orm import relationship class Product(Base): __tablename__ = 'products' id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) price = Column(Float, default=0.0) category_id = Column(Integer, ForeignKey('categories.id')) category = relationship("Category", back_populates="products") class Category(Base): __tablename__ = 'categories' id = Column(Integer, primary_key=True, index=True) title = Column(String, unique=True, nullable=False) products = relationship("Product", back_populates='category') ``` 这里定义了两个相互关联的数据实体——产品及其所属类别,体现了良好的关系型设计原则。 #### 4. 实现路由处理函数 利用 FastAPI 提供的强大装饰器机制快速搭建 RESTful API 服务端点。 ```python from fastapi import Depends, HTTPException, status from typing import List from pydantic import BaseModel app = FastAPI() @app.on_event("startup") async def startup(): await database.connect() @app.on_event("shutdown") async def shutdown(): await database.disconnect() class ProductCreate(BaseModel): name: str price: float category_id: int class ProductRead(ProductCreate): id: int @app.post("/products/", response_model=ProductRead, status_code=status.HTTP_201_CREATED) async def create_product(product: ProductCreate, db: Session = Depends(get_db)): new_entry = Product(**product.dict()) db.add(new_entry) await db.commit() await db.refresh(new_entry) return new_entry @app.get("/products/{id}", response_model=ProductRead) async def read_product(id: int, db: Session = Depends(get_db)): result = await db.query(Product).filter(Product.id == id).first() if not result: raise HTTPException(status_code=404, detail="Item not found") return result @app.put("/products/{id}") async def update_product(id: int, product: ProductCreate, db: Session = Depends(get_db)): existing_item = await db.query(Product).get(id) if not existing_item: raise HTTPException(status_code=404, detail="Item not found") for key, value in product.dict().items(): setattr(existing_item, key, value) await db.commit() return {"message": f"Updated item {id}"} @app.delete("/products/{id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_product(id: int, db: Session = Depends(get_db)): target_record = await db.query(Product).get(id) if not target_record: raise HTTPException(status_code=404, detail="Item not found") await db.delete(target_record) await db.commit() ``` 上述代码实现了完整的增删改查 (CRUD) 功能,允许客户端应用程序轻松地执行各种类型的数据库操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钓愚者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值