告别繁琐的SQL编写,通过自然语言轻松实现数据库查询,Dify让数据交互变得零门槛!
核心内容:
- Dify自然语言转SQL的架构与工作原理
- 测试数据库搭建与只读账户配置
- 数据库插件安装及Agent应用配置步骤
无需Navicat、不用编写SQL,只需提问即可获取结果;今天我们将使用Dify搭建一个自然语言数据库查询助手。
01 功能演示与效果预览
自然语言转SQL的架构原理

工作流程十分简洁:用户提出问题,AI将其转换为SQL语句,随后执行数据库查询,最后将结果返回给用户。
02 前期准备与环境搭建
开始之前需要完成两项任务:准备一个测试数据库,并安装所需的插件。
2.1 搭建测试数据库
为便于演示,我们创建一个简单的产品表,执行以下SQL语句:
-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS dify_demo;
USE dify_demo;
-- 创建产品表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) COMMENT '产品名称',
category VARCHAR(50) COMMENT '产品分类',
price DECIMAL(10,2) COMMENT '价格',
stock INT COMMENT '库存数量',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 插入几条测试数据
INSERT INTO products (name, category, price, stock) VALUES
('机械键盘', '外设', 299.00, 150),
('游戏鼠标', '外设', 89.00, 300),
('4K显示器', '显示设备', 1999.00, 50),
('降噪耳机', '音频', 499.00, 80),
('无线充电器', '配件', 99.00, 200);
数据库表创建完成。

2.2 配置只读数据库账户
建议使用只读账户,即使AI生成错误SQL,也能避免数据被误删或修改。
-- 创建一个只能查询的账号
CREATE USER 'dify_reader'@'%' IDENTIFIED BY '你的密码';
GRANT SELECT ON dify_demo.* TO 'dify_reader'@'%';
FLUSH PRIVILEGES;

2.3 安装数据库连接插件
Dify插件市场提供了现成的数据库连接工具。登录Dify后,依次点击顶部导航栏的「插件」→「插件市场」。

搜索「Database」或「MySQL」。
安装数据库连接插件。
装完后,插件会出现在插件列表里。
2.4 配置数据库连接参数
插件安装完成后,返回Agent应用编排页面,在「工具」区域点击「添加」,选择刚安装的database插件。
配置数据库连接URI:
我的Dify部署在VMware虚拟机上,192.168.1.2是本地Windows电脑的IP。
mysql+pymysql://dify_reader:123456@192.168.1.2:3306/dify_demo
数据库连接配置完成。
03 创建Agent应用
3.1 创建新应用
点击「工作室」→「创建空白应用」,在应用类型中选择「Agent」。
将应用名称设置为「SQL查询助手」,点击创建。
3.2 选择大语言模型
选择已配置好的大语言模型,本示例使用的是DeepSeek。
3.3 编写系统提示词
将以下代码复制到「提示词」输入框中:
你是一个 SQL 查询助手。用户会用自然语言提问,你需要根据数据库表结构生成 SQL 并查询。
## 数据库表结构
products 表:
- id: 产品ID (INT)
- name: 产品名称 (VARCHAR)
- category: 产品分类 (VARCHAR),可选值:外设、显示设备、音频、配件
- price: 价格 (DECIMAL)
- stock: 库存数量 (INT)
- created_at: 创建时间 (DATETIME)
## 规则
1. 根据用户问题,生成对应的 SQL 查询
2. 只生成 SELECT 查询,禁止 UPDATE、DELETE、INSERT
3. 查询结果用自然语言回复用户
4. 如果用户问题与数据库无关,礼貌告知无法回答
## 示例
用户问:最贵的产品是什么?
回复:最贵的产品是「4K显示器」,价格 1999 元。
用户问:库存低于100的有哪些?
回复:以下产品库存低于100:4K显示器(50件)、降噪耳机(80件)。
以上为单表示例,多表场景请参考第06节。
3.4 添加工具组件
在「工具」区域,从database插件列表中选择并添加「Text to SQL」和「SQL Execute」两个工具。
完成后点击右上角的「发布」按钮。
04 效果测试与验证
测试一:基础查询
查询:产品列表有哪些?
测试二:条件筛选查询
查询:库存低于100的产品有哪些?
测试三:聚合函数查询
查询:最贵的产品是什么?
测试过程中若遇到问题,不必担心,以下是常见问题及解决方法。
05 常见问题与解决方案
1. 无法连接MySQL,提示权限拒绝
请检查以下两项配置:
- Windows防火墙是否已开放3306端口。
- MySQL是否已允许远程连接。
-- 查看用户允许的访问来源
SELECT user, host FROM mysql.user;
-- 如果dify_reader的host是localhost,改成%
UPDATE mysql.user SET host = '%' WHERE user = 'dify_reader';
FLUSH PRIVILEGES;
2. 认证方式不兼容错误
MySQL 8默认使用caching_sha2_password认证插件,pymysql不支持该方式,需执行以下命令修改:
ALTER USER 'dify_reader'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
3. AI未调用工具而直接生成答案
系统提示词中未明确指示AI使用工具,需在指令中添加以下内容:
当用户问数据库相关问题时,你必须使用Text to SQL和SQL Execute工具来查询,不能自己编造答案。
06 多表场景的处理方法
以上演示仅涉及单张表,且提示词中硬编码了表结构。若数据库包含数十甚至上百张表,手动写入所有结构显然不现实,此时需要动态获取表结构。
database插件提供了「Get Table Schema」工具,能够自动读取数据库中所有表的字段结构,无需手动编写。
6.1 添加Get Table Schema工具
返回Agent编排页面,在「工具」区域勾选「Get Table Schema」工具。
6.2 更新系统提示词
将「提示词」框中的内容替换为以下代码:
你是一个 SQL 查询助手。用户会用自然语言提问,你需要查询数据库并返回结果。
## 工作流程
1. 先用Get Table Schema工具获取数据库中的所有表结构
2. 根据用户问题,找到相关的表
3. 用Text to SQL生成SQL语句
4. 用SQL Execute执行查询
5. 用自然语言回复用户
## 规则
- 只生成SELECT查询,禁止UPDATE、DELETE、INSERT
- 如果用户问题与数据库无关,礼貌告知无法回答
这样便无需手动书写表结构,AI将自动查询数据库获取最新结构信息。
接下来我们向数据库中添加两张新表。
6.3 重新测试
重新发布应用后再次进行测试。
查询:数据库里有哪些表?
查询:数据库里有哪些表?仅返回表名即可。
07 总结与回顾
回顾本文的主要步骤:
- 准备测试数据库及示例数据表。
- 创建只读数据库账户以确保安全。
- 安装database插件并配置数据库连接。
- 创建Agent应用,编写系统提示词,添加工具组件。
- 验证自然语言查询效果。
- 多表场景优化:使用Get Table Schema动态获取表结构。
今后查询数据,无需打开Navicat、无需手动编写SQL,只需直接提问即可。
本方案的核心要点:
为AI提供充分的上下文信息,并配备正确的工具,即可实现通过自然语言查询数据库。
