跳到主要内容
Python AI
Dify 与 MySQL 深度融合:基于 MCP 协议的数据交互实践 利用 MCP 协议将 Dify 与大语言模型应用开发平台与 MySQL 数据库进行深度整合的技术方案。通过搭建 MCP Server、配置 Agent 策略及工作流,实现了自然语言到 SQL 查询的转换,支持学生管理系统数据的动态查询与分析。文中详细涵盖了环境准备、插件安装、数据库表结构定义、提示词优化及常见问题排查,为开发者提供了从理论到实践的完整参考路径,助力构建智能数据驱动型应用。
随缘 发布于 2026/2/5 更新于 2026/4/18 5.2K 浏览Dify 与 MySQL 深度融合:基于 MCP 协议的数据交互实践
引言:技术融合的奇妙开篇
在当今数字化时代,数据管理与人工智能技术的融合日益紧密。Dify 作为一款强大的大语言模型应用开发平台,通过 MCP(模型上下文协议)与 MySQL 这一广泛使用的关系型数据库进行整合,为开发者们打开了一扇通往高效数据处理与智能应用开发的新大门。这种整合不仅能充分发挥 Dify 在自然语言处理和 AI 应用构建方面的优势,还能借助 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 Linux 9.5 系统上,安装 Docker 的命令如下:
export http_proxy="http://192.168.1.xxx:7897"
https_proxy=
no_proxy=
dnf update
dnf search docker
dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl --now docker
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
export
"http://192.168.1.xxx:7897"
export
"localhost,127.0.0.1"
sudo
sudo
enable
设置 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 .env
docker 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, :::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
此命令会在后台启动 Dify 的所有相关服务,包括前端、后端以及必要的中间件服务。
启动完成后,通过浏览器访问 Dify 的前端界面,默认地址为 http://localhost:3000。首次访问时,需要进行一些基础配置,如设置管理员账号和密码等信息。
接着,配置 Dify 的服务器地址和端口。若采用默认配置,服务器地址即为 localhost,端口为 5000。若需修改,可在 Dify 项目目录下的相关配置文件中进行调整,通常是在 .env 文件中修改 API_SERVER_HOST 和 API_SERVER_PORT 等环境变量,以满足实际的部署需求。
(三)安装与配置 MySQL CREATE DATABASE test CHARACTERSET utf8mb4 COLLATE utf8mb4_unicode_ci;
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= '班级表' ;
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= '课程表' ;
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= '成绩表' ;
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 '电子邮箱,示例:[email protected] ' ,
`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= '学生表' ;
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= '教师表' ;
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' );
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 ,'市级先进班集体' );
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' ,'[email protected] ' ,'13876543210' ,'北京市海淀区中关村大街 1 栋 101 室' ,175 ,65 ,'良好' ),('S20230102' ,'李华' ,'女' ,'2005-02-20 00:00:00' ,'202301' ,'13812345679' ,'[email protected] ' ,'13876543211' ,'上海市浦东新区张江高科技园区 2 栋 201 室' ,165 ,55 ,'良好' ),('S20230201' ,'张明' ,'男' ,'2005-03-10 00:00:00' ,'202302' ,'13812345680' ,'[email protected] ' ,'13876543212' ,'广州市天河区珠江新城 3 栋 301 室' ,180 ,70 ,'良好' ),('S20230202' ,'刘芳' ,'女' ,'2005-04-05 00:00:00' ,'202302' ,'13812345681' ,'[email protected] ' ,'13876543213' ,'深圳市南山区科技园 4 栋 401 室' ,168 ,58 ,'良好' ),('S20230301' ,'陈伟' ,'男' ,'2005-05-15 00:00:00' ,'202303' ,'13812345682' ,'[email protected] ' ,'13876543214' ,'南京市玄武区珠江路 5 栋 501 室' ,178 ,68 ,'良好' ),('S20230302' ,'赵丽' ,'女' ,'2005-06-20 00:00:00' ,'202303' ,'13812345683' ,'[email protected] ' ,'13876543215' ,'杭州市西湖区文三路 6 栋 601 室' ,162 ,52 ,'良好' ),('S20230401' ,'黄强' ,'男' ,'2005-07-10 00:00:00' ,'202304' ,'13812345684' ,'[email protected] ' ,'13876543216' ,'成都市高新区天府软件园 7 栋 701 室' ,176 ,66 ,'良好' ),('S20230402' ,'周静' ,'女' ,'2005-08-05 00:00:00' ,'202304' ,'13812345685' ,'[email protected] ' ,'13876543217' ,'武汉市洪山区光谷广场 8 栋 801 室' ,167 ,57 ,'良好' ),('S20230501' ,'吴伟' ,'男' ,'2005-09-15 00:00:00' ,'202305' ,'13812345686' ,'[email protected] ' ,'13876543218' ,'西安市雁塔区科技路 9 栋 901 室' ,177 ,67 ,'良好' ),('S20230502' ,'郑芳' ,'女' ,'2005-10-20 00:00:00' ,'202305' ,'13812345687' ,'[email protected] ' ,'13876543219' ,'长沙市岳麓区麓谷大道 10 栋 1001 室' ,163 ,53 ,'良好' );
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' );
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。
(二)配置 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 策略
选择 ReAct (Support MCP Tools) 策略 :点击添加的 Agent 节点,在右侧的配置面板中,将 AGENT 策略选择为'ReAct (Support MCP Tools)'。选择该策略的原因在于它对 MCP 工具的支持较为稳定和有效。例如,在实际测试中,若选择 FunctionCalling 策略,可能会遇到调用 MCP 时提示找不到 call_tool 方法的问题,而 ReAct 策略能够避免此类问题,确保 Agent 能够顺利调用 MCP 工具与 MySQL 进行交互。
配置工具列表 :在 Agent 配置面板的'工具列表'部分,点击右侧的添加按钮,选择'通过 SSE 发现和调用 MCP 工具'。然后添加与 MySQL 相关的工具列表,假设之前在 MCP SSE 中配置的 MySQL 服务地址对应的名称为'mysql_mcp_server',则在 MCP 服务器配置中添加:
注:要选择对应模型:建议选用高性能 API 模型以确保工具调用效率。
通过这样的配置,Agent 就能够识别并调用与该 MySQL 服务相关的工具,实现对数据库的查询、更新等操作。
配置指令 :指令部分也就是提示词,它是引导 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 | 电子邮箱 | 必填 | "[email protected] " |
| 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
测试与优化:让融合更完美
(一)工作流测试 完成上述配置后,就可以对创建的 Dify 工作流进行测试,以验证其是否能够正确地与 MySQL 进行整合并实现预期的功能。
测试方式 :进入 Dify 的工作流测试界面,在输入框中输入实际的查询问题,例如'哪个老师学生最多'。这个问题看似简单,却涉及到对数据库中教师与学生关系数据的查询和分析。Dify 工作流接收到这个问题后,会触发之前配置好的 Agent 节点。
工作原理 :Agent 节点根据配置的指令和策略,识别出这是一个需要查询 MySQL 数据库的任务,然后通过 MCP 协议调用相应的 MySQL 工具。该工具将问题转化为 SQL 查询语句,并发送到 MySQL 数据库进行执行。假设数据库中存储教师和学生信息的表分别为 teachers 和 students,且 students 表中有一个字段 teacher_id 用于关联 teachers 表,那么生成的 SQL 查询语句可能类似于:
SELECT teachers.teacher_name, COUNT (students.student_id) AS student_count FROM teachers JOIN students ON teachers.teacher_id = students.teacher_id GROUP BY teachers.teacher_name ORDER BY student_count DESC LIMIT 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.cnf 或 my.ini),确认 bind-address 和 port 参数的设置。
检查 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 的过程中更加顺利地进行开发和调试,确保系统的稳定运行。