当前位置: 首页 > article >正文

fastapi+mysql实现增删改查

说明:
我计划用python的fastapi框架,实现操作MySQL数据库的表,实现增删改查的操作,并且在postman里面测试
step1: 安装数据库依赖

pip install fastapi uvicorn pymysql

step2:C:\Users\Administrator\PycharmProjects\FastAPIProject\main.py

from fastapi import FastAPI, HTTPException, Body, Path
import pymysql.cursors
from typing import Optional, Dict
app = FastAPI()
# 数据库连接配置
DB_CONFIG = {
    'host': 'localhost',
    'user': 'root',
    'password': '123456',
    'db': 'db_spring',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}
# 查询数据库的函数
def query_database(query: str, params=None):
    try:
        connection = pymysql.connect(**DB_CONFIG)
        with connection.cursor() as cursor:
            cursor.execute(query, params)
            result = cursor.fetchall()
        connection.close()
        return result
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))
# 查询表数据的 API 端点
@app.get("/query")
async def query_table(table_name: str):
    query = f"SELECT * FROM {table_name}"
    try:
        data = query_database(query)
        return {"status": "success", "data": data}
    except HTTPException as e:
        return {"status": "error", "message": e.detail}

# 新增用户 (POST)
@app.post("/users")
async def create_user(
    user_data: Dict = Body(..., example={
        "name": "诸葛亮",
        "email": "zhugeliang@shu.com",
        "age": 54
    })
):
    try:
        # 检查邮箱唯一性
        check_query = "SELECT id FROM users WHERE email = %s"
        exist = query_database(check_query, (user_data["email"],))
        if exist:
            raise HTTPException(409, "邮箱已存在")

        # 执行插入操作
        insert_query = """
        INSERT INTO users (name, email, age)
        VALUES (%s, %s, %s)
        """
        with pymysql.connect(**DB_CONFIG) as conn:
            with conn.cursor() as cursor:
                cursor.execute(insert_query, (
                    user_data["name"],
                    user_data["email"],
                    user_data["age"]
                ))
                new_id = cursor.lastrowid
                conn.commit()
        return {"status": "success", "id": new_id}
    except KeyError as e:
        raise HTTPException(400, f"缺失必要字段: {e}")


# 更新用户 (PUT)
@app.put("/users/{user_id}")
async def update_user(
        user_id: int = Path(..., gt=0),
        update_data: Dict = Body(..., example={
            "name": "更新名称",
            "age": 99
        })
):
    try:
        # 检查用户是否存在
        exist = query_database("SELECT id FROM users WHERE id = %s", (user_id,))
        if not exist:
            raise HTTPException(404, "用户不存在")

        # 动态生成更新语句
        set_clause = ", ".join([f"{k}=%s" for k in update_data.keys()])
        update_query = f"UPDATE users SET {set_clause} WHERE id = %s"

        with pymysql.connect(**DB_CONFIG) as conn:
            with conn.cursor() as cursor:
                cursor.execute(update_query, (
                    *update_data.values(),
                    user_id
                ))
                conn.commit()
        return {"status": "success", "affected_rows": cursor.rowcount}
    except pymysql.err.IntegrityError:
        raise HTTPException(409, "邮箱冲突或数据约束失败")
# 删除用户 (DELETE)
@app.delete("/users/{user_id}")
async def delete_user(user_id: int = Path(..., gt=0)):
    try:
        with pymysql.connect(**DB_CONFIG) as conn:
            with conn.cursor() as cursor:
                cursor.execute(
                    "DELETE FROM users WHERE id = %s",
                    (user_id,)
                )
                conn.commit()
                if cursor.rowcount == 0:
                    raise HTTPException(404, "用户不存在")
        return {"status": "success", "deleted_id": user_id}
    except pymysql.err.Error as e:
        raise HTTPException(500, f"数据库错误: {e}")
# 启动应用
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

step3:运行

C:\Users\Administrator\PycharmProjects\FastAPIProject\.venv\Scripts\python.exe -m uvicorn main:app --reload 
INFO:     Will watch for changes in these directories: ['C:\\Users\\Administrator\\PycharmProjects\\FastAPIProject']
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [12132] using StatReload
INFO:     Started server process [2000]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:53269 - "DELETE /users/16 HTTP/1.1" 200 OK

在postman里面,测试验证成功

end


http://www.kler.cn/a/580714.html

相关文章:

  • Flink深入浅出之04:时间、水印、TableSQL
  • 算法与数据结构(回文数)
  • 网易邮箱如何用大数据任务调度实现海量邮件数据处理?Apache DolphinScheduler用户交流会上来揭秘!
  • SpringMVC项目中,涉及到的各种请求
  • element-ui descriptions 组件源码分享
  • 多方安全计算(MPC)电子拍卖系统
  • 防火墙IPSec (无固定IP地址---一对多)
  • Redis- 大key
  • RK3588部署YOLOv8(2):OpenCV和RGA实现模型前处理对比
  • Linux权限维持之vim python 扩展后门(五)
  • Spring 中事务的实现
  • 推荐一款好用在线免费软件工具箱-传道软件箱
  • 框架基本知识总结 Day16
  • 垃圾收集算法与收集器
  • C 语 言 --- 数 组 (2)
  • 【前端】html+css+javascript实现联系我们表单
  • Java生成二维码并在二维码下添加文字,并导出为word
  • Nuxt.js 全栈开发指南:构建现代 Web 应用的终极解决方案
  • 计算机网络--访问一个网页的全过程
  • golang从入门到做牛马:第十一篇-Go语言变量作用域:变量的“生活圈”