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": "删除成功"}
相关推荐
高洁011 小时前
智能体:你的私人数字助理
人工智能·python·数据挖掘·virtualenv·知识图谱
淘矿人1 小时前
DeepSeek V4对决Claude 4.8:AI模型终极横评
java·开发语言·人工智能·python·sql·php·pygame
le1616161 小时前
Android Compose Modifier修饰符
android·compose·modifier
黄林晴1 小时前
Android17新规:内存超限直接杀App,没有崩溃日志怎么排查?
android
showgea1 小时前
Python httpx封装和使用
python·httpx
Yeyu2 小时前
Binder 阻塞检测:跨进程通信的性能陷阱与监控方案
android·性能优化
Asize2 小时前
重生之我在 Vibe Coding 时代当程序员:第十二课,Prompt 不是咒语,是可以沉淀的业务接口
前端·人工智能·python
abigale032 小时前
字典 与 Python 对象 的总结
python·dict·object
●VON2 小时前
鸿蒙Flutter实战:日期选择器与截止日期高亮提醒
android·flutter·华为·harmonyos·鸿蒙