一、如何在fastapi项目中使用数据库
fastapi作为一个高性能的web框架,通过SQLAlchemy工具操作db数据库,本文将深入浅出地讲解如何在FastAPI项目中使用数据库会话对象(db),帮助你快速掌握数据库操作的核心技巧。
二、db概念详解
1.什么是db会话对象
在FastAPI项目中,db通常是指数据库会话对象(Session),它是通过SQLAlchemy库来管理的。db会话对象用于执行数据库操作,如查询、插入、更新和删除。它的核心作用是与数据库进行交互,并管理事务的生命周期。
2.如何使用db会话对象
在FastAPI中,通常通过依赖注入的方式获取db会话对象。以下是一个典型的get_session函数示例:
在fastapi项目中db软件包下:
from sqlalchemy.orm import Session
from .database import SessionLocal # SessionLocal 是数据库会话工厂
# 获取数据库会话的依赖函数
def get_session():
db = SessionLocal()
try:
yield db
finally:
db.close()
在路由中使用时,通过Depends注入db会话
from fastapi import Depends
@app.get("/items")
def read_items(db: Session = Depends(get_session)):
items = db.query(Item).all() # 使用 db 查询数据
return items
3.如何通过db操作数据库
3.1 查询数据
使用db.query()方法
- 查询所有数据
items = db.query(Item).all() # 获取 Item 表中的所有记录
- 查询单条数据
item = db.query(Item).filter(Item.id == 1).first() # 获取 id 为 1 的记录
- 条件查询
items = db.query(Item).filter(Item.price > 100).all() # 获取价格大于 100 的所有记录
- 排序查询
items = db.query(Item).order_by(Item.price.desc()).all() # 按价格降序排列
- 分页查询
items = db.query(Item).offset(10).limit(5).all() # 跳过前 10 条,取接下来的 5 条
3.2 插入数据
使用db.add()和db.commit()方法可以向数据库中插入新记录。
new_item = Item(name="New Item", price=99.99)
db.add(new_item) # 将新记录添加到会话
db.commit() # 提交事务,将记录写入数据库
db.refresh(new_item) # 刷新实例,获取数据库生成的字段(如自增ID)
3.3 更新数据
通过查询获取记录后,可以直接修改记录的属性,然后调用db.commit()提交更改。
item = db.query(Item).filter(Item.id == 1).first()
if item:
item.price = 199.99 # 修改价格
db.commit() # 提交更改
db.refresh(item) # 刷新实例
3.4 删除数据
使用db.delete()和db.commit()方法可以从数据库中删除记录。
item = db.query(Item).filter(Item.id == 1).first()
if item:
db.delete(item) # 删除记录
db.commit() # 提交更改
4.事务管理
数据库会话对象支持事务管理。如果在操作过程中发生错误,可以使用db.rollback()回滚事务。
try:
new_item = Item(name="New Item", price=99.99)
db.add(new_item)
db.commit()
except Exception as e:
db.rollback() # 回滚事务
raise e
finally:
db.close() # 关闭会话
5.数据库模型定义
数据库模型是通过SQLAlchemy的Base类定义的。以下是一个简单的模型示例:
from sqlalchemy import Column, Integer, String, Float
from .database import Base
class Item(Base):
__tablename__ = "items" # 数据库表名
id = Column(Integer, primary_key=True, index=True) # 主键
name = Column(String, index=True) # 名称
price = Column(Float) # 价格
&spm=1001.2101.3001.5002&articleId=145221068&d=1&t=3&u=13fe1dacc53443ad98a619af3a741367)
4356

被折叠的 条评论
为什么被折叠?



