当前代码是运行在mysql5.5创建一个叫做mobileanjian的数据库,创建一个叫做game的表,表的字段分别是id,field1到field10,created_at。其中id是自增的,created_at是数据插入或者修改时自动生成的。数据库和表使用utf-8编码,数据库账号密码均为root。
1、使用flask,gevent,pymysql,sqlalchemy生成增删改查的服务端,生成的服务端部署在在2核2G的服务器上,要求满足600个客户端分别1分钟3次的并发查询量,运行在9090端口。
2、服务端需要有异常处理机制,数据库查询优化机制,日志机制等常见机制
3、查询接口要求如下所示:
3.1支持动态字段个数查询、全部数据、精确查询、模糊查询、比较查询(含大于,小于,等于,大于等于,小于等于,介于)、与查询、或查询、与或组合查询方式
3.2参数使用json获取4、插入接口要求如下:
4.1支持动态字段个数插入
4.2插入数据后返回插入的数据id
4.3输入数据无需传入id和created_at,这两个参数自动生成
4.4参数使用json获取5、删除接口要求如下:
5.1根据id进行删除
5.2支持多个id批量删除数据
5.3返回删除成功和失败的id结果
5.4参数使用json获取6、更新接口要求如下:
6.1根据id进行更新,更新数据时,created_at自动更新数据插入的时间
6.2支持多个id批量更新数据
6.3支持动态字段个数更新
6.4返回更新成功和失败的id结果
6.5参数使用json获取7、自定义sql语句
8、所有接口都需要防止sql注入攻击
一、环境准备
windows server 2016、MySQL 5.5、python 3.9.4、默认端口TCP 9090
1.安装python3.9.4
2.升级pip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
3.配置清华镜像源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
4.安装模块
pip install -r requirements.txt
5.安装小皮面板,部署mysql 5.5服务
6.启动数据库
7.双击运行mobileanjianSQL.py
二、创建数据库和表
根据实际需求修改VARCHAR(1000),一个汉字3字节,VARCHAR最大可以设为65535,65535存2万多个汉字,按需修改,太大了影响数据库性能。
CREATE DATABASE IF NOT EXISTS mobileanjian CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE mobileanjian;
CREATE TABLE IF NOT EXISTS game (
id INT AUTO_INCREMENT PRIMARY KEY,
field1 VARCHAR(1000) DEFAULT NULL,
field2 VARCHAR(1000) DEFAULT NULL,
field3 VARCHAR(1000) DEFAULT NULL,
field4 VARCHAR(1000) DEFAULT NULL,
field5 VARCHAR(1000) DEFAULT NULL,
field6 VARCHAR(1000) DEFAULT NULL,
field7 VARCHAR(1000) DEFAULT NULL,
field8 VARCHAR(1000) DEFAULT NULL,
field9 VARCHAR(1000) DEFAULT NULL,
field10 VARCHAR(1000) DEFAULT NULL,
created_at DATETIME NOT NULL,
KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
三、查询接口 /query
1.全量查询:
// 请求
{
"query_all": true
}
// 响应
{
"status": 200,
"data": [
[1, "value1", "value2", null, null, null, null, null, null, null, null, "2024-03-19 10:00:00"],
[2, "value3", "value4", null, null, null, null, null, null, null, null, "2024-03-19 10:01:00"]
],
"count": 2
}
2.动态字段查询:
// 请求 - 只查询指定字段
{
"and_conditions": {
"field1": {
"type": "exact",
"value": "测试数据"
},
"field3": {
"type": "fuzzy",
"value": "示例"
}
}
}
3.精确查询(与查询):
// 请求 - 多个条件AND连接
{
"and_conditions": {
"field1": {
"type": "exact",
"value": "测试数据1"
},
"field2": {
"type": "exact",
"value": "测试数据2"
}
}
}
// 响应
{
"status": 200,
"data": [
[1, "测试数据1", "测试数据2", null, null, null, null, null, null, null, null, "2024-03-19 10:00:00"]
],
"count": 1
}
4.模糊查询(或查询):
// 请求 - 多个条件OR连接
{
"or_conditions": {
"field1": {
"type": "fuzzy",
"value": "测试"
},
"field2": {
"type": "fuzzy",
"value": "示例"
}
}
}
5.比较查询示例:
// 大于查询
{
"and_conditions": {
"field1": {
"type": "compare",
"operator": ">",
"value": "100"
}
}
}
// 小于等于查询
{
"and_conditions": {
"field2": {
"type": "compare",
"operator": "<=",
"value": "50"
}
}
}
// 区间查询
{
"and_conditions": {
"field3": {
"type": "compare",
"operator": "between",
"min": "1",
"max": "100"
}
}
}
6.与或组合查询:
// 请求 - AND和OR条件组合
{
"and_conditions": {
"field1": {
"type": "exact",
"value": "测试数据"
}
},
"or_conditions": {
"field2": {
"type": "fuzzy",
"value": "示例"
},
"field3": {
"type": "compare",
"operator": ">",
"value": "100"
}
}
}
// 响应
{
"status": 200,
"data": [
[1, "测试数据", "示例A", "200", null, null, null, null, null, null, null, "2024-03-19 10:00:00"],
[2, "测试数据", "其他", "150", null, null, null, null, null, null, null, "2024-03-19 10:01:00"]
],
"count": 2
}
7.复杂组合查询:
// 请求 - 多种条件组合
{
"and_conditions": {
"field1": {
"type": "fuzzy",
"value": "测试"
},
"field2": {
"type": "compare",
"operator": "between",
"min": "1",
"max": "100"
}
},
"or_conditions": {
"field3": {
"type": "exact",
"value":"test"
},
"field4": {
"type": "compare",
"operator": ">=",
"value": "200"
}
}
}
四、插入接口 /insert
// 示例1:插入单条数据
请求:
{
"field1": "测试数据1",
"field2": "测试数据2",
"field3": "测试数据3"
}
响应:
{
"status": 201,
"id": 1,
"message": "Insert successful"
}
// 示例2:插入部分字段
请求:
{
"field1": "测试数据1",
"field5": "测试数据5"
}
响应:
{
"status": 201,
"id": 2,
"message": "Insert successful"
}
五、删除接口 /delete
// 示例1:删除单个ID
请求:
{
"id": 1
}
响应:
{
"status": 200,
"success": "1"
}
// 示例2:批量删除
请求:
{
"id": [1, 2, 3, 4, 5]
}
响应:
{
"status": 200,
"success": "1, 2, 3",
"fail": "4, 5"
}
六、更新接口 /update
// 示例1:更新单个记录
请求:
{
"id": 1,
"field1": "新数据1",
"field2": "新数据2"
}
响应:
{
"status": 200,
"success": "1"
}
// 示例2:批量更新
请求:
{
"id": [1, 2, 3],
"field1": "批量更新的新数据"
}
响应:
{
"status": 200,
"success": "1, 2",
"fail": "3"
}
七、自定义查询接口 /custom_query
// 示例1:简单查询
请求:
{
"sql": "SELECT * FROM game WHERE field1 = :value",
"params": {
"value": "测试数据"
}
}
响应:
{
"status": 200,
"results": [
[1, "测试数据", "value2", null, null, null, null, null, null, null, null, "2024-03-19 10:00:00"]
],
"count": 1
}
// 示例2:复杂查询
请求:
{
"sql": "SELECT field1, field2, created_at FROM game WHERE field1 LIKE :search AND created_at BETWEEN :start_date AND :end_date",
"params": {
"search": "%测试%",
"start_date": "2024-01-01 00:00:00",
"end_date": "2024-12-31 23:59:59"
}
}
响应:
{
"status": 200,
"results": [
["测试数据1", "value2", "2024-03-19 10:00:00"],
["测试数据2", "value3", "2024-03-19 10:01:00"]
],
"count": 2
}
八、错误响应示例:
// 400 错误 - 请求参数错误
{
"status": 400,
"error": "At least one field must be provided for insertion."
}
// 404 错误 - 未找到数据
{
"status": 404,
"message": "No results found",
"count": 0
}
// 415 错误 - 内容类型错误
{
"status": 415,
"error": "Content-Type must be application/json"
}
// 500 错误 - 服务器错误
{
"status": 500,
"error": "Database connection error"
}
注意事项:
- 所有请求都需要设置 Content-Type: application/json
- 所有响应都包含 status 字段表示状态
- 错误响应包含具体的错误信息
- 查询结果包含数据总数
- 日期格式统一为 "YYYY-MM-DD HH:mm:ss"