一、什么是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
测试返回值是否正确: