1. 项目概述
最近在做一个需要让Dify平台访问MySQL数据库的项目,整个过程踩了不少坑,也积累了一些经验。这个方案的核心思路是通过Flask搭建一个本地数据库代理服务,然后利用ngrok将服务暴露到公网,最后在Dify中创建相应的工作流和智能体来实现数据库操作。
这种架构特别适合需要将本地数据库与云端AI平台对接的场景,比如:
- 企业内部系统与AI能力结合
- 快速搭建数据库查询代理
- 为AI应用提供结构化数据支持
整个方案涉及几个关键技术点:
- Flask搭建RESTful API服务
- MySQL连接与操作
- ngrok内网穿透
- Dify工作流配置
- 数据库智能体创建
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心组件与原理
2.1 Flask数据库代理服务
Flask服务是整个架构的核心枢纽,它负责:
- 接收HTTP请求
- 连接MySQL数据库
- 执行SQL语句
- 返回标准化结果
我设计的这个服务有几个关键特点:
-
统一的API接口:只暴露一个/execute端点,通过POST方法接收JSON格式的SQL语句
-
安全隔离:不直接暴露数据库连接信息,客户端只需要知道服务地址
-
自动连接管理:每次请求建立新连接,执行完毕后立即关闭,避免连接泄漏
-
错误处理:捕获并返回数据库操作中的各种异常
python复制# 数据库连接配置示例
config = {
'user': 'your_username', # 实际使用中建议从环境变量读取
'password': 'your_password',
'host': 'localhost', # 如果是Docker环境可能是容器名
'database': 'your_db',
'raise_on_warnings': True # 确保警告也会被捕获
}
重要提示:在实际生产环境中,务必不要将数据库配置硬编码在代码中,应该使用环境变量或配置文件管理敏感信息。
2.2 ngrok内网穿透
ngrok在这里扮演关键角色,它解决了本地服务无法被公网访问的问题。使用ngrok有几个优势:
- 无需公网IP:适合个人开发者或企业内网环境
- HTTPS支持:免费版也提供TLS加密
- 实时监控:可以查看请求和响应详情
- 多协议支持:不仅限于HTTP
启动ngrok的基本命令:
bash复制ngrok http 3000 # 3000是Flask服务端口
使用ngrok时需要注意:
- 免费版域名会随机变化,商业版可以固定子域名
- 流量经过ngrok服务器,敏感数据需要考虑加密
- 长时间运行需要添加authtoken避免会话中断
2.3 Dify工作流设计
Dify工作流负责将数据库操作封装成可复用的组件,主要功能包括:
- 请求转发:将用户输入的SQL发送到我们的代理服务
- 结果处理:将数据库返回的结果格式化
- 错误处理:捕获网络和API错误
工作流的核心是一个Python代码节点,关键逻辑如下:
python复制def main(sql: str) -> dict:
url = "https://your-subdomain.ngrok-free.app/execute" # 替换为你的ngrok地址
payload = {"sql": sql}
try:
response = requests.post(url, json=payload)
if response.status_code ==
