Dify 实现 Text2SQL 并以图表展示结果

Dify 实现 Text2SQL 并以图表展示结果

在这里插入图片描述

1. 建表和登录数据

下面是 Oracle 数据的建表和插入数据的SQL语句。

-- 创建学生成绩表
CREATE TABLE student_scores (
  id NUMBER(19) NOT NULL,
  student_id VARCHAR2(20) NOT NULL,
  student_name VARCHAR2(50) NOT NULL,
  class_name VARCHAR2(50) NOT NULL,
  subject VARCHAR2(50) NOT NULL,
  score NUMBER(5,2) NOT NULL,
  exam_date DATE NOT NULL,
  semester VARCHAR2(30) NOT NULL,
  grade VARCHAR2(20) NOT NULL,
  created_at TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,
  updated_at TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,
  CONSTRAINT pk_student_scores PRIMARY KEY (id)
);

-- 添加注释
COMMENT ON TABLE student_scores IS '学生成绩信息表';
COMMENT ON COLUMN student_scores.id IS '主键ID';
COMMENT ON COLUMN student_scores.student_id IS '学号';
COMMENT ON COLUMN student_scores.student_name IS '学生姓名';
COMMENT ON COLUMN student_scores.class_name IS '班级名称';
COMMENT ON COLUMN student_scores.subject IS '科目名称';
COMMENT ON COLUMN student_scores.score IS '分数';
COMMENT ON COLUMN student_scores.exam_date IS '考试日期';
COMMENT ON COLUMN student_scores.semester IS '学期';
COMMENT ON COLUMN student_scores.grade IS '年级';
COMMENT ON COLUMN student_scores.created_at IS '创建时间';
COMMENT ON COLUMN student_scores.updated_at IS '更新时间';

-- 创建索引
CREATE INDEX idx_student_id ON student_scores(student_id);
CREATE INDEX idx_exam_date ON student_scores(exam_date);
CREATE INDEX idx_subject ON student_scores(subject);
CREATE INDEX idx_class ON student_scores(class_name);

-- 创建序列用于自增ID
CREATE SEQUENCE student_scores_seq
  START WITH 1
  INCREMENT BY 1
  NOCACHE
  NOCYCLE;

-- 创建触发器实现自增ID
CREATE OR REPLACE TRIGGER student_scores_bi
BEFORE INSERT ON student_scores
FOR EACH ROW
BEGIN
  SELECT student_scores_seq.NEXTVAL INTO :NEW.id FROM dual;
  :NEW.created_at := SYSTIMESTAMP;
  :NEW.updated_at := SYSTIMESTAMP;
END;
/

-- 创建触发器实现更新时间自动更新
CREATE OR REPLACE TRIGGER student_scores_bu
BEFORE UPDATE ON student_scores
FOR EACH ROW
BEGIN
  :NEW.updated_at := SYSTIMESTAMP;
END;
/

-- 清空表
TRUNCATE TABLE student_scores;

-- 插入基础测试数据
-- Oracle 使用 CONNECT BY LEVEL 代替 MySQL 的 WITH RECURSIVE
INSERT INTO student_scores (student_id, student_name, class_name, subject, score, exam_date, semester, grade)
SELECT
    '2023' || LPAD(FLOOR(DBMS_RANDOM.VALUE(0, 100)), 3, '0') as student_id,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 11))
        WHEN 1 THEN '张三' WHEN 2 THEN '李四' WHEN 3 THEN '王五'
        WHEN 4 THEN '赵六' WHEN 5 THEN '钱七' WHEN 6 THEN '孙八'
        WHEN 7 THEN '周九' WHEN 8 THEN '吴十' WHEN 9 THEN '郑十一'
        ELSE '王十二'
    END as student_name,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 5))
        WHEN 1 THEN '高一(1)班' WHEN 2 THEN '高一(2)班'
        WHEN 3 THEN '高一(3)班' ELSE '高一(4)班'
    END as class_name,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 6))
        WHEN 1 THEN '语文' WHEN 2 THEN '数学' WHEN 3 THEN '英语'
        WHEN 4 THEN '物理' ELSE '化学'
    END as subject,
    ROUND(60 + DBMS_RANDOM.VALUE(0, 40), 2) as score,
    TO_DATE('2023-12-01', 'YYYY-MM-DD') + FLOOR(DBMS_RANDOM.VALUE(0, 30)) as exam_date,
    '2023-2024学年第一学期' as semester,
    '高一' as grade
FROM DUAL
CONNECT BY LEVEL <= 100;

-- 插入不及格成绩数据
INSERT INTO student_scores (student_id, student_name, class_name, subject, score, exam_date, semester, grade)
SELECT
    '2023' || LPAD(FLOOR(DBMS_RANDOM.VALUE(0, 100)), 3, '0') as student_id,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 11))
        WHEN 1 THEN '张三' WHEN 2 THEN '李四' WHEN 3 THEN '王五'
        WHEN 4 THEN '赵六' WHEN 5 THEN '钱七' WHEN 6 THEN '孙八'
        WHEN 7 THEN '周九' WHEN 8 THEN '吴十' WHEN 9 THEN '郑十一'
        ELSE '王十二'
    END as student_name,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 5))
        WHEN 1 THEN '高一(1)班' WHEN 2 THEN '高一(2)班'
        WHEN 3 THEN '高一(3)班' ELSE '高一(4)班'
    END as class_name,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 6))
        WHEN 1 THEN '语文' WHEN 2 THEN '数学' WHEN 3 THEN '英语'
        WHEN 4 THEN '物理' ELSE '化学'
    END as subject,
    ROUND(40 + DBMS_RANDOM.VALUE(0, 19), 2) as score,
    TO_DATE('2023-12-01', 'YYYY-MM-DD') + FLOOR(DBMS_RANDOM.VALUE(0, 30)) as exam_date,
    '2023-2024学年第一学期' as semester,
    '高一' as grade
FROM DUAL
CONNECT BY LEVEL <= 5;

-- 插入优秀成绩数据
INSERT INTO student_scores (student_id, student_name, class_name, subject, score, exam_date, semester, grade)
SELECT
    '2023' || LPAD(FLOOR(DBMS_RANDOM.VALUE(0, 100)), 3, '0') as student_id,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 11))
        WHEN 1 THEN '张三' WHEN 2 THEN '李四' WHEN 3 THEN '王五'
        WHEN 4 THEN '赵六' WHEN 5 THEN '钱七' WHEN 6 THEN '孙八'
        WHEN 7 THEN '周九' WHEN 8 THEN '吴十' WHEN 9 THEN '郑十一'
        ELSE '王十二'
    END as student_name,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 5))
        WHEN 1 THEN '高一(1)班' WHEN 2 THEN '高一(2)班'
        WHEN 3 THEN '高一(3)班' ELSE '高一(4)班'
    END as class_name,
    CASE FLOOR(DBMS_RANDOM.VALUE(1, 6))
        WHEN 1 THEN '语文' WHEN 2 THEN '数学' WHEN 3 THEN '英语'
        WHEN 4 THEN '物理' ELSE '化学'
    END as subject,
    ROUND(90 + DBMS_RANDOM.VALUE(0, 10), 2) as score,
    TO_DATE('2023-12-01', 'YYYY-MM-DD') + FLOOR(DBMS_RANDOM.VALUE(0, 30)) as exam_date,
    '2023-2024学年第一学期' as semester,
    '高一' as grade
FROM DUAL
CONNECT BY LEVEL <= 5;

2. 创建 Chatflow

详细操作请参考 dify案例分享-基于database插件实现Text2sql的数据库查询图表工作流这篇文章。

这里我使用的是 Oracle 数据库,Database 连接示例,

oracle+oracledb://admin:[email protected]:1521?service_name=freepdb1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 测试

在这里插入图片描述
在这里插入图片描述
完结!