文章目录

  • 解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程
    • 引言:技术融合的奇妙开篇
    • 认识主角:Dify、MCP 与 MySQL
      • (一)Dify:大语言模型应用开发利器
      • (二)MCP:连接的桥梁
      • (三)MySQL:经典数据库
    • 准备工作:搭建融合舞台
      • (一)环境搭建
      • (二)安装与配置 Dify
      • (三)安装与配置 MySQL
    • 关键步骤:Dify 与 MySQL 的牵手过程
      • (一)安装必要插件
      • (二)配置 MCP SSE
      • (三)创建 Dify 工作流
      • (四)配置 Agent 策略
      • (五)搭建MCP SERVER
        • 1.下载代码
        • 2.配置数据库
        • 3.配置依赖
        • 4.启动 mcp server
    • 测试与优化:让融合更完美
      • (一)工作流测试
        • 测试1.列出身高大于等于168cm所有学生
        • 测试2. 列出体重大于等于60kg的学生
        • 测试3. 哪个学生成绩最好
        • 测试4. 总成绩最好的是哪个班级
    • 常见问题与解决方案:排忧解难
      • (一)连接失败
      • (二)工具调用错误
      • (三)SQL 执行错误

解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程

引言:技术融合的奇妙开篇

在当今数字化时代,数据管理与人工智能技术的融合日益紧密。Dify 作为一款强大的大语言模型应用开发平台,通过 MCP(模型上下文协议)与 MySQL 这一广泛使用的关系型数据库进行整合,为开发者们打开了一扇通往高效数据处理与智能应用开发的新大门。这种整合不仅能充分发挥 Dify 在自然语言处理和 AI 应用构建方面的优势,还能借助 MySQL 出色的数据存储和管理能力,实现更复杂、更智能的数据驱动型应用开发,极大地拓展了应用的功能边界和实用性。接下来,就让我们深入探索 Dify 通过 MCP 整合 MySQL 的详细过程与技术细节 。

认识主角:Dify、MCP 与 MySQL

(一)Dify:大语言模型应用开发利器

Dify 是一款极具创新性的开源大语言模型(LLM)应用开发平台 ,它将后端即服务(Backend as Service, BaaS)与 LLMOps 理念巧妙融合,为开发者打造了一个便捷高效的 AI 应用开发环境。其低代码 / 无代码开发模式堪称一大亮点,通过直观的可视化界面,开发者只需简单的拖拽和配置操作,就能轻松定义 Prompt(提示词)、上下文以及插件等关键要素,无需在底层技术细节中耗费过多精力,这使得开发门槛大幅降低,即使是编程经验相对较少的人员也能参与到 AI 应用的开发中来。

Dify 还采用了模块化设计,各个模块功能明确、接口清晰,开发者可以根据具体的项目需求,灵活选择并组合使用这些模块,从而构建出高度个性化的 AI 应用。在功能组件方面,Dify 更是提供了丰富多样的选择,涵盖 AI 工作流、RAG 管道、Agent、模型管理等多个领域,全面支持从应用原型设计到实际生产部署的整个过程。同时,Dify 对多种主流大型语言模型提供了良好的支持,包括 OpenAI 的 GPT 系列、Claude3 等,开发者可以根据应用场景和性能要求,自由选择最契合的模型,进一步提升应用的智能水平和适应性 。

(二)MCP:连接的桥梁

MCP,即模型上下文协议(Model Context Protocol),在 Dify 与 MySQL 的整合中扮演着至关重要的桥梁角色。作为一项新兴的开放协议,MCP 为大语言模型与外部应用之间搭建了一条双向通信通道,宛如 AI 世界里的 “USB-C” 接口,让模型能够便捷地发现、理解并安全调用各种外部工具或 API。

在 Dify 通过 MCP 整合 MySQL 的场景中,MCP 主要发挥了两方面关键作用。一方面,它提供了统一的协议支持,使得 Dify 中的大语言模型能够以标准化的方式与 MySQL 进行交互,避免了因不同数据库接口差异而带来的复杂适配工作。另一方面,MCP 还具备强大的工具调用能力,允许 Dify 根据用户的需求和指令,动态地调用 MySQL 相关的工具和功能,实现对数据库中数据的查询、更新、插入等操作,从而将大语言模型的智能处理能力与 MySQL 的数据存储和管理能力紧密结合起来,为开发者创造出更多的应用可能性 。

(三)MySQL:经典数据库

MySQL 作为一款开源的关系型数据库管理系统,在数据存储和管理领域拥有着广泛的应用和卓越的声誉。它具备众多显著的优势,使其成为了众多企业和开发者的首选数据库之一。

MySQL 以其高度的可靠性和稳定性著称,经过长时间的发展和大规模应用的验证,它能够在各种复杂的环境下稳定运行,确保数据的安全存储和可靠访问,无论是面对小规模的个人项目,还是大规模的企业级应用,MySQL 都能从容应对。在性能方面,MySQL 表现出色,采用了高效的索引和查询优化技术,能够快速处理大规模数据和高并发的访问请求,迅速响应用户的查询和操作指令,为应用提供流畅的运行体验。此外,MySQL 还具备出色的可扩展性,支持水平和垂直扩展,能够根据业务的发展和数据量的增长,灵活地进行部署和配置调整,满足不断变化的业务需求 。同时,MySQL 丰富的生态系统也为开发者提供了便利,大量的开源工具、第三方插件和扩展可供选择,进一步增强了其功能和应用场景。

准备工作:搭建融合舞台

(一)环境搭建

在开始整合 Dify 与 MySQL 之前,需要确保开发环境准备就绪。主要涉及 Python 环境以及相关插件的安装,建议使用 Python 3.8 及以上版本,以确保与后续安装的库和工具具有良好的兼容性。同时,为了实现 Dify 与 MySQL 之间基于 MCP 的通信和数据交互,还需要安装一些关键的插件和依赖库 。例如,用于支持 MCP 协议的相关插件,以及能够实现 Dify 与 MySQL 进行连接和数据操作的数据库驱动插件等,具体版本可根据官方文档和实际测试来确定,以保障系统的稳定性和功能的完整性。

(二)安装与配置 Dify

安装步骤

首先,通过官方 GitHub 仓库获取 Dify 的源代码。打开终端,执行以下命令进行克隆:

git clone https://github.com/langgenius/dify.git --branch 1.1.0

安装过程需要依赖 Docker 和 Docker Compose,若尚未安装,需先完成这两个工具的安装。在 rocky 9.5 系统上,安装 Docker 的命令如下:

# 先开 外网代理export http_proxy="http://192.168.1.xxx:7897"export https_proxy="http://192.168.1.xxx:7897"export no_proxy="localhost,127.0.0.1"#更新dnf源
dnf update
# 搜索docker 镜像
dnf search docker #添加 docker安装包仓库dnf -y install dnf-plugins-corednf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo#安装docker  compose
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#docker 设置为开机自启动
sudo systemctl enable --now docker

设置 docker 的下载镜像代理
在/etc/systemd/system/docker.service.d目录新增文件: http-proxy.conf
文件内容如下:

[Service]
Environment="HTTP_PROXY=http://192.168.1.xxx:7897"
Environment="HTTPS_PROXY=http://192.168.1.xxx:7897"
Environment="NO_PROXY=localhost,127.0.0.1"
systemctl daemon-reload
systemctl restart docker
systemctl status docker

这样在下载镜像时就会很快。

在 Dify 项目目录下,通过 Docker Compose 来启动 Dify 服务。在终端中执行:

 cp .env.example .envdocker compose up -d# 验证安装是否成功
(base) [root@localhost docker]# pwd
/root/dify/docker
(base) [root@localhost docker]# docker compose ps
NAME                     IMAGE                                       COMMAND                   SERVICE         CREATED        STATUS                  PORTS
docker-api-1             langgenius/dify-api:1.2.0                   "/bin/bash /entrypoi…"   api             25 hours ago   Up 25 hours             5001/tcp
docker-db-1              postgres:15-alpine                          "docker-entrypoint.s…"   db              25 hours ago   Up 25 hours (healthy)   5432/tcp
docker-nginx-1           nginx:latest                                "sh -c 'cp /docker-e…"   nginx           25 hours ago   Up 25 hours             0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp
docker-plugin_daemon-1   langgenius/dify-plugin-daemon:0.0.7-local   "/bin/bash -c /app/e…"   plugin_daemon   25 hours ago   Up 25 hours             0.0.0.0:5003->5003/tcp, :::5003->5003/tcp
docker-redis-1           redis:6-alpine                              "docker-entrypoint.s…"   redis           25 hours ago   Up 25 hours (healthy)   6379/tcp
docker-sandbox-1         langgenius/dify-sandbox:0.2.11              "/main"                   sandbox         25 hours ago   Up 25 hours (healthy)   
docker-ssrf_proxy-1      ubuntu/squid:latest                         "sh -c 'cp /docker-e…"   ssrf_proxy      25 hours ago   Up 25 hours             3128/tcp
docker-weaviate-1        semitechnologies/weaviate:1.19.0            "/bin/weaviate --hos…"   weaviate        25 hours ago   Up 25 hours             
docker-web-1             langgenius/dify-web:1.2.0                   "/bin/sh ./entrypoin…"   web             25 hours ago   Up 25 hours             3000/tcp
docker-worker-1          langgenius/dify-api:1.2.0                   "/bin/bash /entrypoi…"   worker          25 hours ago   Up 25 hours             5001/tcp
(base) [root@localhost docker]# 

此命令会在后台启动 Dify 的所有相关服务,包括前端、后端以及必要的中间件服务 。

基础配置

启动完成后,通过浏览器访问 Dify 的前端界面,默认地址为http://localhost:3000。首次访问时,需要进行一些基础配置,如设置管理员账号和密码等信息 。

接着,配置 Dify 的服务器地址和端口。若采用默认配置,服务器地址即为localhost,端口为5000。若需修改,可在 Dify 项目目录下的相关配置文件中进行调整,通常是在.env文件中修改API_SERVER_HOSTAPI_SERVER_PORT等环境变量,以满足实际的部署需求 。

(三)安装与配置 MySQL

安装流程:略

准备表结构和数据:
新建数据库test

CREATE DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

1.班级表

CREATE TABLE `classes` (`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级ID,示例:202301',`className` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级名称,示例:2023级计算机1班',`grade` int NOT NULL COMMENT '年级,示例:2023',`headTeacherId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班主任ID,外键(teachers.id),示例:T003',`classroom` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教室位置,示例:1号楼302',`studentCount` int NOT NULL COMMENT '学生人数,示例:35',`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注信息,示例:市级优秀班集体',PRIMARY KEY (`id`),KEY `headTeacherId` (`headTeacherId`),CONSTRAINT `headTeacherId` FOREIGN KEY (`headTeacherId`) REFERENCES `teachers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='班级表';

2.课程表

CREATE TABLE `courses` (`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程ID,示例:C001',`courseName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程名称,示例:高等数学',`credit` int NOT NULL COMMENT '学分,示例:4',`teacherId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '授课教师ID,外键(teachers.id),示例:T001',`semester` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '学期,格式"YYYY-N",示例:2023-1',`type` enum('必修','选修') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '选修' COMMENT '课程类型,"必修"或"选修",示例:选修',`prerequisite` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '先修课程ID,可选,外键(courses.id),示例:C003',PRIMARY KEY (`id`),KEY `teacherId` (`teacherId`),CONSTRAINT `teacherId` FOREIGN KEY (`teacherId`) REFERENCES `teachers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='课程表';

3.成绩表

CREATE TABLE `scores` (`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '成绩记录ID,示例:S20230101C001',`studentId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生ID,外键(students.id),示例:S20230101',`courseId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '课程ID,外键(courses.id),示例:C001',`score` int NOT NULL COMMENT '综合成绩,0-100,示例:85',`examDate` date NOT NULL COMMENT '考试日期,示例:2024-5-20',`usualScore` int DEFAULT '0' COMMENT '平时成绩,0-100,示例:90',`finalScore` int DEFAULT '0' COMMENT '期末成绩,0-100,示例:80',PRIMARY KEY (`id`),KEY `studentId` (`studentId`),KEY `courseId` (`courseId`),CONSTRAINT `courseId` FOREIGN KEY (`courseId`) REFERENCES `courses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `studentId` FOREIGN KEY (`studentId`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='成绩表';

4.学生表

CREATE TABLE `students` (`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学号,示例:S20230101',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '学生姓名,示例:王强',`gender` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '男' COMMENT '性别,"男"或"女",示例:男',`birthDate` datetime NOT NULL COMMENT '出生日期,示例:2005-01-15',`classId` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '班级ID,外键(classes.id),示例:202301',`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话,示例:13812345678',`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '电子邮箱,示例:20230101@school.edu.cn',`emergencyContact` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '紧急联系人电话,示例:13876543210',`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '家庭住址,示例:北京市海淀区中关村大街1栋101室',`height` int NOT NULL COMMENT '身高(cm),示例:175',`weight` int NOT NULL COMMENT '体重(kg),示例:65',`healthStatus` enum('良好‌','一般‌','较差') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '良好‌' COMMENT '健康状况,示例:良好',PRIMARY KEY (`id`),KEY `classId` (`classId`),CONSTRAINT `classId` FOREIGN KEY (`classId`) REFERENCES `classes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='学生表';

5.教师表

CREATE TABLE `teachers` (`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教师ID,示例:T001',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教师姓名,示例:张建国',`gender` enum('男','女') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '男' COMMENT '性别,"男"或"女",示例:男',`subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '教授科目,示例:数学',`title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '职称,示例:教授',`phone` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '联系电话,示例:13812345678',`office` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '办公室位置,示例:博学楼301',`wechat` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '微信,示例:lily_teacher',`isHeadTeacher` enum('true','false') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'false' COMMENT '是否为班主任,示例:true',PRIMARY KEY (`id`,`office`) USING BTREE,KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='教师表';

录入数据

  1. 插入 teachers 表数据
INSERT INTO `teachers` (`id`, `name`, `gender`, `subject`, `title`, `phone`, `office`, `wechat`, `isHeadTeacher`) VALUES
('T001', '张建国', '男', '数学', '教授', '13812345678', '博学楼301', 'lily_teacher', 'true'),
('T002', '李明', '男', '英语', '副教授', '13812345679', '博学楼302', 'tom_teacher', 'false'),
('T003', '王芳', '女', '物理', '讲师', '13812345680', '博学楼303', 'lucy_teacher', 'true'),
('T004', '赵强', '男', '化学', '副教授', '13812345681', '博学楼304', 'jack_teacher', 'false'),
('T005', '陈静', '女', '计算机', '教授', '13812345682', '博学楼305', 'rose_teacher', 'true'),
('T006', '刘伟', '男', '语文', '讲师', '13812345683', '博学楼306', 'mike_teacher', 'false'),
('T007', '黄丽', '女', '历史', '副教授', '13812345684', '博学楼307', 'jane_teacher', 'true'),
('T008', '周明', '男', '地理', '讲师', '13812345685', '博学楼308', 'ben_teacher', 'false'),
('T009', '吴芳', '女', '生物', '教授', '13812345686', '博学楼309', 'susan_teacher', 'true'),
('T010', '郑强', '男', '政治', '副教授', '13812345687', '博学楼310', 'david_teacher', 'false');
  1. 插入 classes 表数据
INSERT INTO `classes` (`id`, `className`, `grade`, `headTeacherId`, `classroom`, `studentCount`, `remark`) VALUES
('202301', '2023级计算机1班', 2023, 'T005', '1号楼302', 35, '市级优秀班集体'),
('202302', '2023级数学1班', 2023, 'T001', '1号楼303', 32, '校级优秀班集体'),
('202303', '2023级英语1班', 2023, 'T002', '1号楼304', 30, NULL),
('202304', '2023级物理1班', 2023, 'T003', '1号楼305', 34, '校级先进班集体'),
('202305', '2023级化学1班', 2023, 'T004', '1号楼306', 31, NULL),
('202201', '2022级计算机1班', 2022, 'T005', '1号楼402', 36, '市级优秀班集体'),
('202202', '2022级数学1班', 2022, 'T001', '1号楼403', 33, NULL),
('202203', '2022级英语1班', 2022, 'T002', '1号楼404', 32, '校级优秀班集体'),
('202204', '2022级物理1班', 2022, 'T003', '1号楼405', 30, NULL),
('202205', '2022级化学1班', 2022, 'T004', '1号楼406', 35, '市级先进班集体');
  1. 插入 students 表数据
INSERT INTO `students` (`id`, `name`, `gender`, `birthDate`, `classId`, `phone`, `email`, `emergencyContact`, `address`, `height`, `weight`, `healthStatus`) VALUES
('S20230101', '王强', '男', '2005-01-15 00:00:00', '202301', '13812345678', '20230101@school.edu.cn', '13876543210', '北京市海淀区中关村大街1栋101室', 175, 65, '良好'),
('S20230102', '李华', '女', '2005-02-20 00:00:00', '202301', '13812345679', '20230102@school.edu.cn', '13876543211', '上海市浦东新区张江高科技园区2栋201室', 165, 55, '良好'),
('S20230201', '张明', '男', '2005-03-10 00:00:00', '202302', '13812345680', '20230201@school.edu.cn', '13876543212', '广州市天河区珠江新城3栋301室', 180, 70, '良好'),
('S20230202', '刘芳', '女', '2005-04-05 00:00:00', '202302', '13812345681', '20230202@school.edu.cn', '13876543213', '深圳市南山区科技园4栋401室', 168, 58, '良好'),
('S20230301', '陈伟', '男', '2005-05-15 00:00:00', '202303', '13812345682', '20230301@school.edu.cn', '13876543214', '南京市玄武区珠江路5栋501室', 178, 68, '良好'),
('S20230302', '赵丽', '女', '2005-06-20 00:00:00', '202303', '13812345683', '20230302@school.edu.cn', '13876543215', '杭州市西湖区文三路6栋601室', 162, 52, '良好'),
('S20230401', '黄强', '男', '2005-07-10 00:00:00', '202304', '13812345684', '20230401@school.edu.cn', '13876543216', '成都市高新区天府软件园7栋701室', 176, 66, '良好'),
('S20230402', '周静', '女', '2005-08-05 00:00:00', '202304', '13812345685', '20230402@school.edu.cn', '13876543217', '武汉市洪山区光谷广场8栋801室', 167, 57, '良好'),
('S20230501', '吴伟', '男', '2005-09-15 00:00:00', '202305', '13812345686', '20230501@school.edu.cn', '13876543218', '西安市雁塔区科技路9栋901室', 177, 67, '良好'),
('S20230502', '郑芳', '女', '2005-10-20 00:00:00', '202305', '13812345687', '20230502@school.edu.cn', '13876543219', '长沙市岳麓区麓谷大道10栋1001室', 163, 53, '良好');
  1. 插入 courses 表数据
INSERT INTO `courses` (`id`, `courseName`, `credit`, `teacherId`, `semester`, `type`, `prerequisite`) VALUES
('C001', '高等数学', 4, 'T001', '2023-1', '必修', NULL),
('C002', '大学英语', 3, 'T002', '2023-1', '必修', NULL),
('C003', '大学物理', 4, 'T003', '2023-1', '必修', NULL),
('C004', '大学化学', 3, 'T004', '2023-1', '必修', NULL),
('C005', '计算机基础', 3, 'T005', '2023-1', '必修', NULL),
('C006', '数据结构', 4, 'T005', '2023-2', '选修', 'C005'),
('C007', '线性代数', 3, 'T001', '2023-2', '选修', 'C001'),
('C008', '概率论与数理统计', 4, 'T001', '2023-2', '选修', 'C001'),
('C009', '英语口语', 2, 'T002', '2023-2', '选修', 'C002'),
('C010', '物理实验', 2, 'T003', '2023-2', '选修', 'C003');
  1. 插入 scores 表数据
INSERT INTO `scores` (`id`, `studentId`, `courseId`, `score`, `examDate`, `usualScore`, `finalScore`) VALUES
('S20230101C001', 'S20230101', 'C001', 85, '2024-05-20', 90, 80),
('S20230101C002', 'S20230101', 'C002', 90, '2024-05-20', 85, 95),
('S20230101C005', 'S20230101', 'C005', 95, '2024-05-20', 92, 98),
('S20230201C001', 'S20230201', 'C001', 88, '2024-05-20', 87, 90),
('S20230201C003', 'S20230201', 'C003', 82, '2024-05-20', 80, 85),
('S20230301C002', 'S20230301', 'C002', 87, '2024-05-20', 85, 90),
('S20230301C004', 'S20230301', 'C004', 80, '2024-05-20', 78, 82),
('S20230401C003', 'S20230401', 'C003', 86, '2024-05-20', 84, 88),
('S20230401C005', 'S20230401', 'C005', 92, '2024-05-20', 90, 94),
('S20230501C004', 'S20230501', 'C004', 84, '2024-05-20', 82, 86);

关键步骤:Dify 与 MySQL 的牵手过程

(一)安装必要插件

在 Dify 平台中,要实现通过 MCP 整合 MySQL,首先需要安装两个关键插件:Agent 策略(支持 MCP 工具) 和 MCP SSE 。

Agent 策略集合(支持 MCP SSE 发现和调用工具)
github地址:https://github.com/junjiem/dify-plugin-agent-mcp_sse

通过 HTTP with SSE 传输使用 MCP 协议来发现和调用工具。
github地址:https://github.com/junjiem/dify-plugin-tools-mcp_sse
在这里插入图片描述

(二)配置 MCP SSE

插件安装完成后,需要对 MCP SSE 进行配置,以建立与 MySQL 服务的连接。具体操作如下:
在 Dify 的插件管理界面中,点击已安装的 MCP SSE 插件。
在这里插入图片描述
点击上图中的已授权,出现如下图,配置上mcp mysq server的sse 地址:

{"mysql_mcp_server_pro":{"url":"http://192.168.1.XXX:9000/sse"}}

注:不要留空格,不然会报错。

在这里插入图片描述

填写完成后,点击保存。这样,Dify 就能够通过 MCP SSE 插件与指定的 MySQL 服务地址进行通信,为后续的数据交互做好准备 。

(三)创建 Dify 工作流

接下来,需要在 Dify 中创建一个工作流,用于实现与 MySQL 的交互逻辑 。创建过程如下:

进入 Dify 的工作流创建页面,选择创建工作流类型为 “Chatflow”,并为工作流命名,例如 “Dify_MySQL_Integration” 。
在这里插入图片描述

在工作流设计画布中,默认会有一个 LLM 节点,但在我们的场景中,需要删除该节点,因为我们主要通过 Agent 来调用 MySQL 相关工具 。
在这里插入图片描述

从节点库中拖拽一个 “Agent” 节点到画布上 。这个 Agent 节点将作为与 MySQL 交互的核心组件,负责根据用户的指令调用相应的 MCP 工具,实现对 MySQL 数据库的操作 。此时,一个基本的工作流框架就搭建好了,后续还需要对 Agent 进行详细配置 。

(四)配置 Agent 策略

1.选择 ReAct (Support MCP Tools) 策略:点击添加的 Agent 节点,在右侧的配置面板中,将 AGENT 策略选择为 “ReAct (Support MCP Tools)” 。选择该策略的原因在于它对 MCP 工具的支持较为稳定和有效 。例如,在实际测试中,若选择 FunctionCalling 策略,可能会遇到调用 MCP 时提示找不到 call_tool 方法的问题,而 ReAct 策略能够避免此类问题,确保 Agent 能够顺利调用 MCP 工具与 MySQL 进行交互 。
在这里插入图片描述

2.配置工具列表:在 Agent 配置面板的 “工具列表” 部分,点击右侧的添加按钮,选择 “通过 SSE 发现和调用 MCP 工具” 。然后添加与 MySQL 相关的工具列表,假设之前在 MCP SSE 中配置的 MySQL 服务地址对应的名称为 “mysql_mcp_server”,则在 MCP 服务器配置中添加:

在这里插入图片描述
注:要选择对应模型:
我原来选择我本地部署的deepseek:14B ,非常慢,导致达不到预想的结果,后面改成用阿里百炼云的API 模型,效果杆杆的。
通过这样的配置,Agent 就能够识别并调用与该 MySQL 服务相关的工具,实现对数据库的查询、更新等操作 。

3. 配置指令:指令部分也就是提示词,它是引导 Agent 正确执行任务的关键 。例如,可以设置如下指令:
在这里插入图片描述

使用中文回复。当用户提问中涉及学生、教师、成绩、班级、课程等实体时,需要使用 MySQL MCP 进行数据查询和操作,表结构说明如下:# 学生管理系统数据库表结构说明## 1. 教师表 (teachers)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 教师ID | 主键 | "T001" |
| name | varchar | 教师姓名 | 必填 | "张建国" |
| gender | enum | 性别 | "男"或"女" | "男" |
| subject | varchar | 教授科目 | 必填 | "数学" |
| title | varchar | 职称 | 必填 | "教授" |
| phone | varchar | 联系电话 | 必填 | "13812345678" |
| office | varchar | 办公室位置 | 必填 | "博学楼301" |
| wechat | varchar | 微信(可选) | 可选 | "lily_teacher" |
| isHeadTeacher | enum | 是否为班主任,"true"或"false" | 可选 | true |## 2. 班级表 (classes)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 班级ID | 主键 | "202301" |
| className | varchar | 班级名称 | 必填 | "2023级计算机1班" |
| grade | int | 年级 | 必填 | 2023 |
| headTeacherId | varchar | 班主任ID | 外键(teachers.id) | "T003" |
| classroom | varchar | 教室位置 | 必填 | "1号楼302" |
| studentCount | int | 学生人数 | 必填 | 35 |
| remark | varchar | 备注信息 | 可选 | "市级优秀班集体" |## 3. 课程表 (courses)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 课程ID | 主键 | "C001" |
| courseName | varchar | 课程名称 | 必填 | "高等数学" |
| credit | int | 学分 | 必填 | 4 |
| teacherId | varchar | 授课教师ID | 外键(teachers.id) | "T001" |
| semester | varchar | 学期 | 格式"YYYY-N" | "2023-1" |
| type | enum | 课程类型 | "必修"或"选修" | "必修" |
| prerequisite | varchar | 先修课程ID | 可选,外键(courses.id) | "C003" |## 4. 学生表 (students)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 学号 | 主键 | "S20230101" |
| name | varchar | 学生姓名 | 必填 | "王强" |
| gender | enum | 性别 | "男"或"女" | "男" |
| birthDate | date | 出生日期 | 必填 | date("2005-01-15") |
| enrollmentDate | date | 入学日期 | 必填 | date("2023-8-1") |
| classId | varchar | 班级ID | 外键(classes.id) | "202301" |
| phone | varchar | 联系电话 | 必填 | "13812345678" |
| email | varchar | 电子邮箱 | 必填 | "20230101@school.edu.cn" |
| emergencyContact | varchar | 紧急联系人电话 | 必填 | "13876543210" |
| address | varchar | 家庭住址 | 必填 | "北京市海淀区中关村大街1栋101室" |
| height | int | 身高(cm) | 必填 | 175 |
| weight | int | 体重(kg) | 必填 | 65 |
| healthStatus | enum | 健康状况 | 必填,"良好"或"一般‌"或"较差" | "良好" |## 5. 成绩表 (scores)| 字段名 | 类型 | 描述 | 约束 | 示例 |
|--------|------|------|------|------|
| id | varchar | 成绩记录ID | 主键 | "S20230101C001" |
| studentId | varchar | 学生ID | 外键(students.id) | "S20230101" |
| courseId | varchar | 课程ID | 外键(courses.id) | "C001" |
| score | int | 综合成绩 | 0-100 | 85 |
| examDate | date | 考试日期 | 必填 | date("2024-5-20") |
| usualScore | int | 平时成绩 | 0-100 | 90 |
| finalScore | int | 期末成绩 | 0-100 | 80 |### 补考成绩记录说明
补考记录在_id后添加"_M"后缀,如"S20230101C001_M"## 表关系说明1. **一对多关系**:- 一个班级(classes)对应多个学生(students)- 一个教师(teachers)可以教授多门课程(courses)- 一个学生(students)有多条成绩记录(scores)2. **外键约束**:- students.classId → classes.id- courses.teacherId → teachers.id- scores.studentId → students.id- scores.courseId → courses.id- classes.headTeacherId → teachers.id

这里的 “query” 变量将作为用户输入的查询内容,传递给 Agent,Agent 根据这个变量的值调用相应的 MySQL 工具进行查询操作 。同时,还需要设置最大迭代次数,该参数用于控制工具调用的深度和复杂性,防止出现无限循环或过度调用工具的情况,避免资源浪费和系统性能问题,默认值通常为 3,可根据实际需求进行调整 。最后,在 “连接直接回复” 部分选择变量 “Agent.text”,这样 Agent 执行任务后的结果将通过该变量直接回复给用户 。完成上述配置后,点击发布预览,一个能够通过 MCP 与 MySQL 进行整合的 Dify 工作流就配置完成了 。

(五)搭建MCP SERVER

1.下载代码
 git clone https://github.com/wenb1n-dev/mysql_mcp_server_pro.git
2.配置数据库
vi .env
cd mysql_mcp_server_pro/src/config

在这里插入图片描述

3.配置依赖
pip install mcp
pip install mysql-connector-python
pip install uvicorn
pip install python-dotenv
pip install starlette
4.启动 mcp server
uv run server.py

在这里插入图片描述

测试与优化:让融合更完美

(一)工作流测试

完成上述配置后,就可以对创建的 Dify 工作流进行测试,以验证其是否能够正确地与 MySQL 进行整合并实现预期的功能 。

测试方式:进入 Dify 的工作流测试界面,在输入框中输入实际的查询问题,例如 “哪个老师学生最多” 。这个问题看似简单,却涉及到对数据库中教师与学生关系数据的查询和分析。Dify 工作流接收到这个问题后,会触发之前配置好的 Agent 节点 。

工作原理:Agent 节点根据配置的指令和策略,识别出这是一个需要查询 MySQL 数据库的任务,然后通过 MCP 协议调用相应的 MySQL 工具 。该工具将问题转化为 SQL 查询语句,并发送到 MySQL 数据库进行执行 。假设数据库中存储教师和学生信息的表分别为teachersstudents,且students表中有一个字段teacher_id用于关联teachers表,那么生成的 SQL 查询语句可能类似于:

SELECT teachers.teacher_name, COUNT(students.student_id) AS student_countFROM teachersJOIN students ON teachers.teacher_id = students.teacher_idGROUP BY teachers.teacher_nameORDER BY student_count DESCLIMIT 1;

结果查看:MySQL 数据库执行查询后,将结果返回给 Dify 工作流中的 Agent 节点,Agent 节点再将结果按照之前配置的格式和变量,通过 “连接直接回复” 中的Agent.text变量返回给用户 。用户在 Dify 的工作流测试界面中就能看到查询结果,例如 “教师 [具体教师姓名] 的学生最多,共有 [X] 名学生” 。通过这样的测试过程,可以直观地验证 Dify 与 MySQL 的整合是否成功,以及工作流的配置是否正确 。如果测试过程中出现问题,如查询结果为空、报错等,就需要仔细检查工作流的配置、SQL 语句的正确性以及数据库的连接和权限设置等方面,逐步排查并解决问题 。

测试1.列出身高大于等于168cm所有学生

原数据如下:
在这里插入图片描述
大模型回答的结果:

在这里插入图片描述
符合预期。

测试2. 列出体重大于等于60kg的学生

在这里插入图片描述

符合预期。

测试3. 哪个学生成绩最好

在这里插入图片描述
在这里插入图片描述
符合预期。

测试4. 总成绩最好的是哪个班级

在这里插入图片描述
符合预期。

常见问题与解决方案:排忧解难

在 Dify 通过 MCP 整合 MySQL 的过程中,可能会遇到一些常见问题,下面为大家一一列举并提供相应的解决方案 。

(一)连接失败

错误描述:在配置 MCP SSE 连接 MySQL 服务地址后,Dify 无法成功连接到 MySQL,可能提示 “连接超时” 或 “无法找到服务器” 等错误信息 。

可能原因

网络问题:MySQL 服务器与 Dify 所在的服务器之间网络不通,可能是由于防火墙阻止了连接,或者网络配置错误 。例如,MySQL 服务器的防火墙未开放 Dify 连接所需的端口(默认为 3306),导致 Dify 无法建立连接 。

地址或端口错误:在配置 MCP SSE 的 MySQL 服务地址和端口时,填写错误 。如将 IP 地址写错,或者端口号与 MySQL 实际监听的端口不一致 。

MySQL 服务未正常运行:MySQL 服务器端的服务可能未启动,或者在运行过程中出现异常停止,导致无法响应 Dify 的连接请求 。

解决方案

检查网络和防火墙:在 MySQL 服务器上,检查防火墙设置,确保 Dify 所在服务器的 IP 地址能够访问 MySQL 的端口 。在 Linux 系统中,若使用的是 ufw 防火墙,可通过sudo ufw allow 3306命令开放 3306 端口(假设 MySQL 使用默认端口) 。对于 CentOS 系统,使用firewall - cmd --zone = public --add - port = 3306/tcp --permanent命令添加端口规则,并执行sudo firewall - cmd --reload使规则生效 。同时,可使用ping命令测试两台服务器之间的网络连通性,使用telnet命令测试端口是否可访问,如telnet mysql_server_ip 3306

确认地址和端口:仔细检查 MCP SSE 配置中填写的 MySQL 服务地址和端口,确保与 MySQL 服务器的实际配置一致 。可登录 MySQL 服务器,查看 MySQL 配置文件(通常是my.cnfmy.ini),确认bind - addressport参数的设置 。

检查 MySQL 服务状态:在 MySQL 服务器上,使用sudo systemctl status mysql命令检查 MySQL 服务是否正在运行 。若服务未运行,可使用sudo systemctl start mysql命令启动服务 。如果服务启动失败,查看 MySQL 的错误日志(通常位于/var/log/mysql/error.log),根据日志信息排查具体原因,如数据库文件损坏、配置错误等 。

(二)工具调用错误

错误描述:在 Dify 工作流中,配置好 Agent 策略和工具列表后,调用 MySQL 相关工具时,提示 “找不到工具” 或 “工具调用失败” 等错误 。

可能原因

插件安装或配置问题:Agent 策略 (支持 MCP 工具) 和 MCP SSE 插件可能未正确安装,或者在插件配置过程中出现错误 。例如,MCP SSE 插件的 sse 地址配置错误,导致无法正确发现和调用 MySQL 工具 。

策略选择不当:在 Agent 配置中,选择的 AGENT 策略与 MCP 工具不兼容 。如前文提到的,若选择 FunctionCalling 策略,可能会遇到调用 MCP 时提示找不到 call_tool 方法的问题 。

工具列表配置错误:在 Agent 的工具列表中,MCP 服务器地址配置错误,或者未正确添加与 MySQL 相关的工具 。

解决方案

检查插件安装和配置:在 Dify 的插件管理界面,确认 Agent 策略 (支持 MCP 工具) 和 MCP SSE 插件已成功安装 。对于 MCP SSE 插件,点击插件进入配置页面,检查添加的 sse 地址是否正确 。若有多个 MCP 应用,确保每个应用的地址和配置都准确无误 。可参考前文安装插件时的步骤和配置示例,重新核对配置信息 。

选择正确的策略:将 Agent 的 AGENT 策略选择为 “ReAct (Support MCP Tools)”,该策略对 MCP 工具的支持较为稳定 。避免使用可能存在兼容性问题的策略,如 FunctionCalling 策略 。

核对工具列表配置:在 Agent 的工具列表配置中,仔细检查 MCP 服务器地址的配置,确保与 MCP SSE 插件中配置的地址一致 。同时,确认已正确添加与 MySQL 相关的工具,可参考前文工作流配置中工具列表的添加步骤和示例,重新添加或修改工具列表 。

(三)SQL 执行错误

错误描述:在 Dify 工作流测试时,输入查询问题后,返回的结果提示 SQL 执行错误,如 “语法错误”“表不存在” 等 。

可能原因

提示词或指令问题:在 Agent 配置的指令(提示词)中,对用户输入的解析和转换为 SQL 语句的逻辑存在问题,导致生成的 SQL 语句语法错误 。例如,指令中对变量的引用错误,或者对查询条件的描述不清晰,使得生成的 SQL 语句无法正确执行 。

数据库结构变化:MySQL 数据库中的表结构发生了变化,如字段名称修改、表被删除等,但 Dify 工作流中的配置和查询逻辑未及时更新,导致查询时提示 “表不存在” 或 “未知列” 等错误 。

解决方案

优化提示词和指令:仔细检查 Agent 配置中的指令,确保其能够准确地将用户输入转换为正确的 SQL 语句 。可参考一些 SQL 生成的示例和规则,对指令进行优化和调试 。例如,在指令中明确变量的使用方式和查询条件的表达,如 “使用中文回复。查询学生表中成绩大于变量 score 的学生信息,变量 score 由用户输入” 。同时,在工作流测试时,逐步分析用户输入和生成的 SQL 语句之间的转换过程,找出问题所在并进行修正 。

同步数据库结构信息:定期检查 MySQL 数据库的结构变化,当数据库结构发生改变时,及时更新 Dify 工作流中的相关配置和查询逻辑 。可以建立数据库结构变更的通知机制,确保开发人员能够及时了解数据库的变化情况 。在 Dify 工作流中,根据新的数据库结构,修改查询语句中的表名、字段名等信息,以保证查询的正确性 。例如,若 “students” 表被重命名为 “student_information”,则需要在 Dify 工作流的查询语句中相应地修改表名 。通过对这些常见问题的分析和解决,可以帮助开发者在 Dify 通过 MCP 整合 MySQL 的过程中更加顺利地进行开发和调试,确保系统的稳定运行 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93311.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93311.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93311.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杂记 02

1 WSL安装 WSL的安装遇到了问题,睡醒起来发现电脑蓝屏了,linux系统没装好,但是好像大部分开发环境都是linux下需要的,先这样用一下吧,到时候再说。可以问下前辈开发细节,主要是网络代理问题,保…

剧本杀小程序系统开发:重构推理娱乐生态

在娱乐产业蓬勃发展的今天,推理娱乐作为一种充满智慧和挑战的娱乐形式,受到了越来越多人的喜爱。剧本杀,作为推理娱乐的代表之一,正以其独特的魅力吸引着大量玩家。而剧本杀小程序系统开发,则为推理娱乐生态的重构带来…

力扣习题:基本计算器

本片内容我们将针对于一个力扣中的一道很经典的习题:基本计算器。 这道题目十分经典,在很多大厂的面试题中都有出现过 因此我们将进一步来学习 该题目代码已经上传作者的个人gitee:CPP 学习代码库: C代码库新库,旧有C仓库满员了喜…

Element用法---Loading 加载

仅供参考 文章目录一、加载动画二、Loading 组件1、指令调用 Loading2、服务调用 Loading一、加载动画 当我们打开某个页面时,如果需要加载的数据很多或者网络很差,页面加载就会非常缓慢,中间可能会很长时间显示空白,那么就需要加…

飞算AI 3.2.0实战评测:10分钟搭建企业级RBAC权限系统

飞算AI 3.2.0实战评测:10分钟搭建企业级RBAC权限系统 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都…

事务的四大特性

事务(Transaction)是数据库管理系统(DBMS)中用于保证数据操作正确性和一致性的核心机制。事务的特性通常用 ACID 四个字母概括,分别代表 原子性(Atomicity)、一致性(Consistency&…

WIN11系统下Open3D 0.19.0支持GPU的python版本

前往Open 3D官网下载https://github.com/isl-org/Open3D下载对应版本的源码。 根据官方手册利用cmake进行编译&安装,其中需要修改一些代码适应于win 11系统,编译时间较长需要耐心等待。最后,安装结果如下图,搞了四天&#xff…

ICCV 2025 | 4相机干掉480机位?CMU MonoFusion高斯泼溅重构4D人体!

​​​​ 近日,卡内基梅隆大学(Carnegie Mellon University)的研究团队在动态场景重建领域取得重要进展。其发表于ICCV 2025的论文《MonoFusion: Sparse-View 4D Reconstruction via Monocular Fusion》提出创新方法MonoFusion 。该方法突破常…

ADB 无线调试连接(Windows + WSL 环境)

gradle wrapper --gradle-version 8.4 Windows WSL 成功连接 Android 设备(用于 ./gradlew installDebug)的完整过程总结:✅ ADB 无线调试连接过程(Windows WSL 环境) 📌 目标:从 WSL 中通过 …

【.net core】【wetercloud】处理前端项目免登陆,且从前端项目跳转至系统内时的问题

1.前端项目访问后台内容时免登陆(一般用于后台接口需要校验登陆时)处理思路:将后台用户的登陆校验令牌信息在用户登录后添加至前端项目访问地址的参数列表中,如:https://yourdomain/Home/Index#/https://yourdomain/vi…

设备 AI 知识库,管理效率新飞跃

在设备管理领域,高效解决设备故障、合理规划维护工作对企业生产运营至关重要。易点易动设备管理系统新推出的设备 AI 知识库,为提升管理效率带来了新契机。设备 AI 知识库集成先进的人工智能技术,是设备管理领域的创新应用。易点易动设备管理…

C#绘制斐波那契螺旋

Fabonacci 数列,也就是”兔子数列“, 如果第一项为0的话,就是, 0,1,1,2,3,5,8,13,21,34,55,89……

JavaScript 任务 - clearTimeout 函数与 clearInterval 函数

clearTimeout 函数 1、基本介绍 clearTimeout 函数用于取消先前通过 setTimeout 函数设置的定时器 clearTimeout(【timeoutID】)参数说明timeoutID要取消的定时器的标识符,这个 ID 是由 setTimeout 函数返回的2、演示 let timeoutId1 setTimeout(() > {console.…

在 CentOS 7 中使用 systemd 创建自定义服务

systemd 创建自定义服务简述创建自定义服务步骤文件覆盖优先级创建服务流程在 /etc/systemd/system/ 目录下创建 .service 文件(需 root 权限):编写服务配置模板Systemd 服务文件三大区块详解[Unit] 区块 - 服务元数据与依赖[Service] 区块 -…

【QT】printsupport库远程实现打印机打印

【QT】printsupport库远程实现打印机打印 前言 思路 实现 当前所有可用打印机浏览 打印预览 打印输出 手动选择打印 自动打印 防呆补充 库打包 前言 在打印机的通讯控制方式中,有USB、网口、串口、WIFI等,针对局域网环境下,用自研软件控制打印机打印的应用场景,针对自研软…

LT3045EDD#TRPBF ADI亚德诺 超低噪声LDO稳压器 电子元器件IC

LT3045EDD#TRPBF ADI 超低噪声LDO稳压器专业解析1. 产品技术档案LT3045EDD#TRPBF是ADI(Analog Devices Inc.)推出的超低噪声/超高PSRR线性稳压器,采用DFN-12 (3x3mm)封装,以其0.8μVRMS超低噪声和79dB超高频PSRR成为精密电源设计。…

易语言模拟真人鼠标轨迹算法 - 非贝塞尔曲线

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟人…

Spring Boot 3 数据源连接信息存储方法

在Spring Boot 3中,数据源连接信息的存储方式主要有以下几种,根据安全性和环境需求选择合适的方式: 1. 配置文件(推荐基础方式) 位置:src/main/resources/application.properties 或 application.yml 示例…

按键序列常用示例

按键序列常用示例 按键编码 基础按键对应编码 A-Z 原字符即可 KeyCodeSHIFTCTRL^ALT% 其他按键 KeyCodeBACKSPACE{BACKSPACE}, {BS}, or {BKSP}BREAK{BREAK}CAPS LOCK{CAPSLOCK}DEL or DELETE{DELETE} or {DEL}DOWN ARROW{DOWN}END{END}ENTER{ENTER} or ~ESC{ESC}HELP{HEL…

【LeetCode Solutions】LeetCode 热题 100 题解(36 ~ 40)

CONTENTS二叉树 - LeetCode 94. 二叉树的中序遍历(简单)二叉树 - LeetCode 104. 二叉树的最大深度(简单)二叉树 - LeetCode 226. 翻转二叉树(简单)二叉树 - LeetCode 101. 对称二叉树(简单&…