Dify实现自然语言生成SQL并执行

目录

一、需求分析

二、解决思路

问题1:文字描述生成SQL语句

问题2:执行生成的SQL语句

完整解决方案

三、最终效果展示

四、具体实现

1.节点一

2.节点二

3.节点三

4.节点四

5.节点五

6.节点六

7.配置展示预览


一、需求分析

  • 文字描述生成SQL语句

  • 执行生成的SQL语句

二、解决思路

问题1:文字描述生成SQL语句

解决: 创建工作流应用,添加知识检索节点,导入知识库,添加LLM进行推导生成SQL

问题2:执行生成的SQL语句

解决:创建工作流应用,添加HTTP请求节点,传入SQL语句执行

完整解决方案

创建工作流应用,添加知识检索节点,导入知识库,添加LLM进行推导生成SQL,添加HTTP请求节点,传入SQL语句执行。

三、最终效果展示

imgimg

四、具体实现

1.节点一

添加输入字段变量

img

2.节点二

添加知识检索节点,添加知识库。

知识库内容为:(导入时采用父子分段以及混合检索)

-- 创建用户表
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    register_date DATETIME NOT NULL,
    vip_status TINYINT NOT NULL DEFAULT 0 COMMENT '0-非VIP,1-VIP',
    INDEX idx_username (username),
    INDEX idx_email (email),
    INDEX idx_register_date (register_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储注册的用户信息';

-- 创建商品表
CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    category ENUM('电子产品','家居用品','服装') NOT NULL,
    price DECIMAL(10,2) NOT NULL COMMENT '商品价格(单位是人民币/元)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品基本信息';

-- 创建订单表
CREATE TABLE `order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    product_id INT NOT NULL,
    order_date DATETIME NOT NULL,
    total_amount DECIMAL(12,2) NOT NULL COMMENT '订单金额',
    status VARCHAR(20) NOT NULL COMMENT '0:已签收 1:已退回',
    INDEX idx_user_id (user_id),
    INDEX idx_order_date (order_date),
    INDEX idx_status (status),
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户订单表';

数据库中创建表以及初始化数据

-- 创建用户表
CREATE TABLE users (
    user_id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    register_date DATETIME NOT NULL,
    vip_status TINYINT NOT NULL DEFAULT 0 COMMENT '0-非VIP,1-VIP',
    INDEX idx_username (username),
    INDEX idx_email (email),
    INDEX idx_register_date (register_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='存储注册的用户信息';
​
-- 创建商品表
CREATE TABLE products (
    product_id INT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(100) NOT NULL,
    category ENUM('电子产品','家居用品','服装') NOT NULL,
    price DECIMAL(10,2) NOT NULL COMMENT '商品价格(单位是人民币/元)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品基本信息';
​
-- 创建订单表
CREATE TABLE `order` (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    product_id INT NOT NULL,
    order_date DATETIME NOT NULL,
    total_amount DECIMAL(12,2) NOT NULL COMMENT '订单金额',
    status VARCHAR(20) NOT NULL COMMENT '0:已签收 1:已退回',
    INDEX idx_user_id (user_id),
    INDEX idx_order_date (order_date),
    INDEX idx_status (status),
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户订单表';
​
-- 插入用户数据
INSERT INTO users (username, email, register_date, vip_status) VALUES
('张三', 'zhangsan@example.com', '2022-01-15 10:30:00', 1),
('李四', 'lisi@example.com', '2022-02-20 14:15:00', 0),
('王五', 'wangwu@example.com', '2022-03-10 09:45:00', 1),
('赵六', 'zhaoliu@example.com', '2022-04-05 16:20:00', 0),
('钱七', 'qianqi@example.com', '2022-05-12 11:10:00', 1);
​
-- 插入商品数据
INSERT INTO products (product_name, category, price) VALUES
('iPhone 14', '电子产品', 6999.00),
('华为MateBook', '电子产品', 5999.00),
('真皮沙发', '家居用品', 4599.00),
('陶瓷餐具套装', '家居用品', 299.00),
('纯棉T恤', '服装', 99.00),
('牛仔裤', '服装', 199.00);
​
-- 插入订单数据
INSERT INTO `order` (user_id, product_id, order_date, total_amount, status) VALUES
(1, 1, '2022-06-01 10:30:00', 6999.00, '0'),
(1, 3, '2022-06-05 14:15:00', 4599.00, '0'),
(2, 2, '2022-06-10 09:45:00', 5999.00, '1'),
(3, 4, '2022-06-15 16:20:00', 299.00, '0'),
(3, 5, '2022-06-20 11:10:00', 99.00, '0'),
(4, 6, '2022-07-01 13:25:00', 199.00, '0'),
(5, 1, '2022-07-05 15:30:00', 6999.00, '0'),
(5, 2, '2022-07-10 10:45:00', 5999.00, '0');

3.节点三

大模型推导生成SQL

img

SYSTEM

你是一个MySQL专家,严格根据提供的 {{#context#}} 表结构和字段信息以及用户输入的 {{#1743389238066.context#}} 查询需求,生成准确、高效、语法兼容的SQL语句。
​
# 硬性要求
1. 仅使用 {{#context#}} 中提供的表名和字段名,禁止添加任何未明确声明的字段或表
2. 确保SQL完全兼容MySQL 5.7及以上版本语法
3. 输出必须是一条可直接执行的完整SQL语句,禁止包含任何注释、解释或中间过程
4. 支持单表查询、多表关联(JOIN/LEFT JOIN/INNER JOIN等)、子查询等复杂查询
5. 正确处理表间关联关系,使用明确的ON条件指定关联字段
6. 包含必要的WHERE条件、GROUP BY、HAVING、ORDER BY和LIMIT子句(当需求需要时)
7. 表名和字段名必须使用原始名称,禁止使用别名替换或翻译
8. 仅输出最终SQL文本,不要包含任何额外字符、提示或格式
​
# 特别注意
- 当涉及多表关联时,必须明确指定关联条件
- 确保SELECT的字段在对应表中存在
- 使用参数化查询风格处理变量值(如WHERE id = ?)
- 保持SQL语句的简洁性和高效性
4.节点四

img

本地启动的python代码:

from flask import Flask, request, jsonify
import mysql.connector
from functools import wraps
​
app = Flask(__name__)
​
# 数据库连接配置
config = {
    'user': 'xxx',
    'password': 'xxx',
    'host': 'xxx',
    'database': 'dify',
    'raise_on_warnings': True
}
​
def handle_errors(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        try:
            return f(*args, **kwargs)
        except Exception as e:
            return jsonify({"error": str(e)}), 500
    return wrapper
​
@app.route('/execute', methods=['POST'])
@handle_errors
def execute_sql():
    data = request.get_json()
    if not data or 'sql' not in data:
        return jsonify({"error": "SQL statement is required"}), 400
​
    sql = data['sql']
​
    try:
        conn = mysql.connector.connect(**config)
        cursor = conn.cursor(dictionary=True)  # 使用字典游标获取列名
​
        cursor.execute(sql)
​
        if sql.strip().lower().startswith("select"):
            result = cursor.fetchall()
            return jsonify({"data": result})
        else:
            conn.commit()
            return jsonify({"affected_rows": cursor.rowcount})
​
    except mysql.connector.Error as err:
        return jsonify({"error": f"Database error: {err}"}), 500
    finally:
        if 'conn' in locals() and conn.is_connected():
            cursor.close()
            conn.close()
​
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=3000, debug=True)

注意:

如果将代码贴入到本地后一些数据爆红(需要安装所需环境)

参考执行命令:

pip install flask

python -m pip show flask

pip install mysql-connector-python

5.节点五

格式化数据(自定义是否需要)

img

6.节点六

img

7.配置展示预览

至此所有配置结束,发布进行测试即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伏颜.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值