fastapi数据库操作,添加数据,修改数据,删除数据,创建

本文介绍了如何使用FastAPI框架和SQLAlchemyORM技术来创建一个简单的WebAPI,实现对学生信息的增删改查功能,包括获取学生列表、创建新学生、更新学生信息和删除学生记录。
摘要由CSDN通过智能技术生成
from fastapi import  FastAPI,Depends,HTTPException,Path
from pydantic import BaseModel
import uvicorn
app = FastAPI()

from sqlalchemy import create_engine ,select,asc,Integer,String,update,delete
from sqlalchemy.orm import DeclarativeBase,sessionmaker,Mapped,mapped_column

engine = create_engine('mysql+pymysql://root:kobe123456@localhost/computer',echo=True)



# 修改数据的函数

def  set_attr(obj,data:dict):

      if data:
            for key ,value in data.items():

                 # 用这个函数修改数据
                 setattr(obj,key,value)


class  Base(DeclarativeBase):
     pass

class  StudentEntity(Base):
       __tablename__ = "students"
       id:Mapped[int] = mapped_column(Integer,primary_key=True)
       name:Mapped[str] = mapped_column(String(128),unique=True,nullable=False)
       gender:Mapped[str] = mapped_column(String(10),nullable=False)



Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)


class  StudentBase(BaseModel):
      name:str
      gender:str


class  StudentUpdate(StudentBase):
     ...

class CreateStudent(StudentBase):
     ...

class StudentOut(StudentBase):
     id:int


def  get_db_session():

     db_session = Session()
     try:

          yield db_session
     finally:

          db_session.close()


@app.get('/students',response_model=list[StudentOut])
async def get_students(db_students:Session = Depends(get_db_session)):
    query = select(StudentEntity).order_by(asc(StudentEntity.name))
    return  db_students.execute(query).scalars().all()


# 添加数据
@app.post('/create/student',response_model=StudentOut)
async  def  create_students(student:CreateStudent,create_student:Session = Depends(get_db_session)):

            # 判断
            query = select(StudentEntity).where(StudentEntity.name == student.name)
            records = create_student.execute(query).scalars().all()
            if records:
                  raise HTTPException(status_code=400,detail=f"{student.name} is  already  exists")

            # 如果records不存在,就执行
            student_entity = StudentEntity(name=student.name,gender=student.gender)
            create_student.add(student_entity)
            create_student.commit()
            return student_entity


# 检查学生使用的函数
def  check_student_exists(student_id:int,db_session:Session):
    query = select(StudentEntity).where(StudentEntity.id == student_id)
    exists_student = db_session.execute(query).scalar()

    # 判断是否存在
    if not exists_student:
        raise HTTPException(status_code=404, detail=f"id为:{student_id} ==>not  found...")

    return exists_student



# 修改数据
@app.put('/update/student/{studentId}',response_model=StudentOut)
async  def update_students(*,studentId:int=Path(...),student:StudentUpdate,update_student:Session = Depends(get_db_session)):



       # query = select(StudentEntity).where(StudentEntity.id == studentId)
       # exist_student= update_student.execute(query).scalar()
       # if not exist_student:
       #       raise HTTPException(status_code=401,detail=f'{studentId} not  exists')

       # 代替上面的三行
       exist_student = check_student_exists(studentId,update_student)
       # 修改数据的第一种方法
       # exist_student.name = student.name
       # exist_student.gender = student.gender

       # 第二种方法 但是有缺点
       # update_query  = update(StudentEntity).values(student.model_dump()).where(StudentEntity.id == studentId)
       # update_student.execute(update_query)
       # update_student.commit()


       # 第三种方法最简单,最实用
       set_attr(exist_student,student.model_dump())

       update_student.commit()
       return exist_student








# 删除记录的函数
@app.delete('/remove/sudent/{student_id}',response_model=StudentOut)
async  def  delete_student(student_id:int=Path(...),db_session:Session = Depends(get_db_session)):

        exists_student = check_student_exists(student_id,db_session)

        db_session.delete(exists_student)
        db_session.commit()
        return exists_student








if __name__ == '__main__':

    uvicorn.run('main:app',port=9999,reload=True)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值