python(fastapi) 实现更新,新增,删除接口

1.新增

python 复制代码
#新增接口
#用户输入图书信息(ID,书名。作者,价格,出版社)
#用户输入参数=》请求体参数
class BookCreate(BaseModel):
    id: int
    bookname: str
    author: str
    price: float
    publisher: str
@app.post("/book/add")
async def add_book(book: BookCreate, db: AsyncSession = Depends(get_database)):
    #orm对象 转
    new_book = Book(**book.model_dump())
    db.add(new_book)
    await db.commit()
    return {"message": "添加成功"}

接口测试

2.更新

python 复制代码
#更新接口
class BookUpdate(BaseModel):
    bookname: str
    author: str
    price: float
    publisher: str

@app.put("/book/update/{book_id}")
async def update_book(book_id: int, data: BookUpdate, db: AsyncSession = Depends(get_database)):
   #1.查找图书
   db_book=await db.get(Book,book_id)
   # 如果未找到,抛出异常
   if db_book is None:
       raise HTTPException(status_code=404, detail="图书未找到")
   # 找到了则修改:重新赋值
   db_book.bookname = data.bookname
   db_book.author = data.author
   db_book.price = data.price
   db_book.publisher = data.publisher
   # 提交修改
   await db.commit()
   return {"message": "更新成功"}

测试接口

3.删除

python 复制代码
#删除接口
@app.delete("/book/delete/{book_id}")
async def delete_book(book_id: int, db: AsyncSession = Depends(get_database)):
    #先查在删 提交
    db_book=await db.get(Book,book_id)
    if db_book is None:
        raise HTTPException(status_code=404, detail="图书未找到")
    await db.delete(db_book)
    await db.commit()
    return {"message": "删除成功"}

测试接口

完整代码

python 复制代码
from unittest import result

from fastapi import FastAPI,Depends,HTTPException
from datetime import datetime
from sqlalchemy import String, DateTime, func,select
from sqlalchemy.ext.asyncio import create_async_engine,async_sessionmaker, AsyncSession
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from pydantic import BaseModel
app = FastAPI()

# 1.创建异步引擎
#ASYNC_DATAASE_URL为数据库的地址
ASYNC_DATAASE_URL = "mysql+aiomysql://root:630229@localhost:3306/fast_api_db?charset=utf8"
async_engine = create_async_engine(
    ASYNC_DATAASE_URL,
    echo=True, # 可选删除SQL日志
    pool_size=10, #设置连接池活跃的连接数
    max_overflow=20, # 允许额外的连接数

)

# 2.定义模型类: 基类+表对应的模型类
# 基类:创建时间、更新时间;书籍表:id、书名、作者、价格、出版社
class Base(DeclarativeBase):

    create_time: Mapped[datetime] = mapped_column(
        DateTime,
        insert_default=func.now(),
        default=datetime.now,
        comment="创建时间"
    )
    update_time: Mapped[datetime] = mapped_column(
        DateTime,
        insert_default=func.now(),
        onupdate=func.now(),
        default=datetime.now,
        comment="修改时间"
    )


class Book(Base):
    __tablename__ = "book"
    id: Mapped[int] = mapped_column(primary_key=True, comment="书籍id")
    bookname: Mapped[str] = mapped_column(String(255), comment="书名")
    author: Mapped[str] = mapped_column(String(255), comment="作者")
    price: Mapped[float] = mapped_column(comment="价格")
    publisher: Mapped[str] = mapped_column(String(255), comment="出版社")


# 3.启动应用时建表,FASTAPI启动时调用建表的函数
async def create_tables():
    #创建异步引擎,创建事务建表
    async with async_engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all) #模型类的元数据


@app.on_event("startup")
async def startup_event():
    await create_tables()


@app.get("/")
async def root():
    return {"message": "Hello World"}


# 路由匹配中使用 ORM ,创建依赖项,使用 Depends注入到处理函数
# 需求:查询功能的接口,查询图书=》依赖注入:创建依赖项获取数据库会话+Depends注入路由处理函数

# 4.创建异步会话工厂
AsyncSessionLocal = async_sessionmaker(
    bind=async_engine, # 绑定异步引擎
    class_=AsyncSession, # 设置会话类为异步会话
    expire_on_commit=False # 设置会话提交时是否自动刷新
)

# 5.依赖项:获取数据库会话
async def get_database():
    async with AsyncSessionLocal() as session:
        try:
            yield session # 返回数据库会话
            await session.commit() # 提交事务
        except Exception:
            await session.rollback() # 回滚事务
            raise
        finally:
            await session.close() # 关闭会话

# 6.路由:查询图书(获取所有)
@app.get("/book/books")
async def get_books_list(session: AsyncSession = Depends(get_database)):
    result = await session.execute(select(Book)) #查询返回一个ORM对象
    books = result.scalars().all() #获取所有
    return books

# 7.路由:查询图书(获取第一个)
@app.get("/book/firstbook")
async def get_books_list(session: AsyncSession = Depends(get_database)):
    result = await session.execute(select(Book)) #查询返回一个ORM对象
    book = result.scalars().first() #获取第一个
    return book


# 7.路由:查询图书(获取单条数据根据ID查询)
@app.get("/book/IDbook")
async def get_books_list(session: AsyncSession = Depends(get_database)):
    book = await session.get(Book,3) #获取单条数据根据ID查询
    return book


# 8.需求:路径参数,书籍id
@app.get("/book/get_book/{book_id}")
async def get_book(book_id: int,session: AsyncSession = Depends(get_database)):
     res = await session.execute(select(Book).where(Book.id == book_id))
     book = res.scalar_one_or_none()
     return book

# 9.需求:条件查询,价格大于等于
@app.get("/book/search_book")
async def get_books_list(book_price: int,session: AsyncSession = Depends(get_database)):
    res = await session.execute(select(Book).where(Book.price >= book_price))
    books = res.scalars().all()
    return books

#10 模糊查询
@app.get("/book/like_book")
async def get_books_list(session: AsyncSession = Depends(get_database)):
    #需求 :作者author以周开头查询 % _
    #like() 模糊查询:% 任意个字符; _一个单个字符
    #res = await session.execute(select(Book).where(Book.author.like("周%")))
    #res = await session.execute(select(Book).where(Book.author.like("周_")))

    # & | ~ 逻辑运算符
    # res = await session.execute(select(Book).where((Book.author.like("周%")) % (Book.price>30)))
    # res = await session.execute(select(Book).where((Book.author.like("周%")) | (Book.price > 30)))

    #in() 包含
    res = await session.execute(select(Book).where(Book.author.in_(["周树人", "周国平"])))
    books = res.scalars().all()
    return books

#聚合查询
@app.get("/book/count")
async def get_book_count(db: AsyncSession = Depends(get_database)):

    # 聚合查询 select(func.方法名(模型类.属性)
    #count统计行数量
    #result =await db.execute(select(func.count(Book.id)))
    #max求最大值
    #result = await db.execute(select(func.max(Book.price)))
    #min求最小值
    result = await db.execute(select(func.min(Book.price)))
    #avg求平均值
   # result = await db.execute(select(func.avg(Book.price)))
    #sum求和
   # result = await db.execute(select(func.sum(Book.price)))
    # scalar() 提取单个值,空表时返回 0
    count = result.scalar()
    return {"count": count}

#分页查询
@app.get("/book/page")
async def get_book_page(page: int = 1, page_size: int = 2, db: AsyncSession = Depends(get_database)):
    result = await db.execute(select(Book).offset((page - 1) * page_size).limit(page_size))
    books = result.scalars().all()
    return books


#新增接口
#用户输入图书信息(ID,书名。作者,价格,出版社)
#用户输入参数=》请求体参数
class BookCreate(BaseModel):
    id: int
    bookname: str
    author: str
    price: float
    publisher: str
@app.post("/book/add")
async def add_book(book: BookCreate, db: AsyncSession = Depends(get_database)):
    #orm对象 转
    new_book = Book(**book.model_dump())
    db.add(new_book)
    await db.commit()
    return {"message": "添加成功"}

#更新接口
class BookUpdate(BaseModel):
    bookname: str
    author: str
    price: float
    publisher: str

@app.put("/book/update/{book_id}")
async def update_book(book_id: int, data: BookUpdate, db: AsyncSession = Depends(get_database)):
   #1.查找图书
   db_book=await db.get(Book,book_id)
   # 如果未找到,抛出异常
   if db_book is None:
       raise HTTPException(status_code=404, detail="图书未找到")
   # 找到了则修改:重新赋值
   db_book.bookname = data.bookname
   db_book.author = data.author
   db_book.price = data.price
   db_book.publisher = data.publisher
   # 提交修改
   await db.commit()
   return {"message": "更新成功"}


#删除接口
@app.delete("/book/delete/{book_id}")
async def delete_book(book_id: int, db: AsyncSession = Depends(get_database)):
    #先查在删 提交
    db_book=await db.get(Book,book_id)
    if db_book is None:
        raise HTTPException(status_code=404, detail="图书未找到")
    await db.delete(db_book)
    await db.commit()
    return {"message": "删除成功"}
相关推荐
学测绘的小杨6 小时前
CompassFusion:一个从 GNSS 到 GNSS/INS 组合导航的独立工程包
python
方白羽8 小时前
Android Gradle 缓存与文件目录深度解析
android·gradle·android studio
曲幽12 小时前
Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
android·termux·nohup·services·wake-lock
zzzzzz31012 小时前
当产品经理说这个很简单:我用Python自动化处理奇葩需求的实战指南
python·pycharm·产品经理
plainGeekDev12 小时前
单例模式 → object 声明
android·java·kotlin
雪隐13 小时前
个人电脑玩AI-06让5060 Ti给你打工——不光能画画,Qwen3-TTS还能学人说话,连我老板都信了!
人工智能·后端·python
程序员陆业聪13 小时前
读者点单·03|Compose 与传统 View 混用的 12 个真实坑
android
程序员陆业聪13 小时前
读者点单·02|Android 启动优化实战:Trace 抓取→Application 编排→冷启动全流程拆解
android
Coffeeee13 小时前
帮你快速理解AI Agent之我想招个Android实习生
android·人工智能·agent
恋猫de小郭14 小时前
苹果 AirPods 协议,Android 也可以使用完整版 AirPods 能力
android·前端·flutter