使用FastAPI连接MySQL实现完整的增删改查功能

一、什么是FastAPI?

FastAPI 是一个基于 Python 的现代 Web 框架,专为构建高性能、易于维护的API接口而设计。它基于标准 Python 类型提示,能够自动生成交互式的 API 文档,极大地提升了开发效率与用户体验。

二、为什么要选择FastAPI?

  • 异步特性: FastAPI 原生支持异步操作,可处理高并发请求,显著提高应用程序的性能。

  • 速度快: 得益于异步编程模型,FastAPI 的运行速度媲美 Node.js 和 Go 等高性能框架。

  • 自动生成API文档: 开发者无需手动维护 API 文档,FastAPI 可自动生成交互式的 Swagger UI 和 ReDoc 文档。

  • 学习曲线平滑: 其语法清晰、简洁,文档详细,初学者也能迅速上手并搭建出高质量的API服务。

三、MySQL作为数据库的优势和广泛性

  • 使用场景广泛: MySQL 是全球使用最广泛的关系型数据库之一,广泛用于网站、企业应用、数据分析等场景。

  • 易用性强: 安装简单,语法清晰,资料丰富,无论是初学者还是企业级开发团队,都能快速上手。

  • 生态成熟: 拥有强大的社区支持与丰富的开发工具,维护成本低、稳定性高,满足绝大部分项目需求。

四、安装依赖

pip install fastapi uvicorn mysql-connector-python

五、实现分页查询功能

1,准备MySQL数据库

CREATE TABLE `files` (
  `file_id` int NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  `file_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
  PRIMARY KEY (`file_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1071 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;

2,创建FastAPI应用(main.py

app = FastAPI()

# 建立MySQL数据库连接
mydb = mysql.connector.connect(
    host='localhost',
    user='root',
    password='123456',
    database='myku'
)

# 创建游标
mycursor = mydb.cursor()

@app.get("/files")
async def get_files(page: int = Query(0, ge=0), size: int = Query(0, ge=0)):
    # 构建分页查询条件
    query_conditions = ""
    if page > 0 and size > 0:
        offset = (page - 1) * size
        query_conditions = f"LIMIT {offset}, {size}"

    # 执行SQL查询,获取文件列表
    query = "SELECT file_id, file_name, file_type FROM files " + query_conditions
    mycursor.execute(query)
    files_data = mycursor.fetchall()

    # 执行SQL查询,获取文件总数
    total_query = "SELECT COUNT(*) FROM files"
    mycursor.execute(total_query)
    total = mycursor.fetchone()[0]

    # 构建响应数据
    data = [{"id": row[0], "file_name": row[1], "file_type": row[2]} for row in files_data]

    response_data = {
        "code": 0,
        "message": "Success",
        "data": data,
        "total": str(total)
    }

    return JSONResponse(content=response_data)

六、实现数据批量插入功能

1,准备MySQL数据库

CREATE TABLE `point_cloud_labels` (
  `id` int NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) DEFAULT NULL,
  `label` varchar(255) DEFAULT NULL,
  `x` varchar(255) DEFAULT NULL,
  `y` varchar(255) DEFAULT NULL,
  `z` varchar(255) DEFAULT NULL,
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `cloud_id` (`file_name`)
) ENGINE=InnoDB AUTO_INCREMENT=193 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

2,实现批量插入API接口

@app.post("/labels")
async def add_or_update_label(label: Label):
    try:
        # 将字符串形式的 JSON 数组转换为 Python 列表
        points_list = json.loads(label.points)

        # 构建批量插入数据
        insert_query = """
        INSERT INTO point_cloud_labels (file_name, x, y, z, label)
        VALUES (%s, %s, %s, %s, %s)
        ON DUPLICATE KEY UPDATE label = VALUES(label)
        """
        points_data = [(label.file_name, point['x'], point['y'], point['z'], label.label) for point in points_list]

        # 批量插入数据
        mycursor.executemany(insert_query, points_data)
        mydb.commit()

        # 获取当前时间作为创建时间
        create_time = datetime.now().strftime('%Y-%m-%dT%H:%M:%S')

        return {"code": 0, "message": "Label added or updated successfully", "create_time": create_time}
    except Exception as e:
        mydb.rollback()
        raise HTTPException(status_code=500, detail=str(e))

七、接口测试与效果展示

uvicorn main:app --host 0.0.0.0 --port 8888 --reload

访问fastapi自带调试文档,在IP和端口号后面加上/docs

测试返回值是否正确:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值