通过Dify + ollama 实现本地部署的大模型使用自然语言查询数据库

        最近在部署本地大模型时突然想到了,能不能通过自然语言提问,并通过模型转换为sql,直接查询数据库,经过一番尝试,也是成功做出来了,直接上dify流程图及成果:

下面是详细过程:

环境配置

        将 dify 和 ollama 安装到本地并运行,在ollama上安装你想使用的ai模型和Embedding模型,此过程不再赘述。本地需要有数据库,我这里准备的是mysql。准备好后在地址栏输入http://localhost/install 即可进入dify。

数据准备

        先在数据库中创建表,填充数据,我这里使用ai生成了20条测试数据:

注意:最好是在创建表时加上字段备注,方便后续使用自然语言提问。

CREATE TABLE `movies` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '电影名',
  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '导演',
  `release_year` int DEFAULT NULL COMMENT '上映年份',
  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '类型',
  `rating` decimal(3,1) DEFAULT NULL COMMENT '评分',
  `duration` int DEFAULT NULL COMMENT '电影时长',
  `column` longtext COMMENT '表字段',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (1, '霸王别姬', '陈凯歌', 1993, '剧情', 9.6, 171, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (2, '英雄', '张艺谋', 2002, '动作', 8.0, 99, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (3, '活着', '张艺谋', 1994, '剧情', 8.7, 125, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (4, '唐山大地震', '冯小刚', 2010, '灾难', 7.6, 130, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (5, '让子弹飞', '姜文', 2010, '喜剧', 8.0, 132, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (6, '无间道', '刘伟强, 陈木胜', 2002, '犯罪', 8.0, 101, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (7, '大话西游之大圣娶亲', '刘镇伟', 1995, '喜剧', 8.1, 87, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (8, '东成西就', '刘镇伟', 1993, '喜剧', 7.7, 100, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (9, '红高粱', '张艺谋', 1987, '剧情', 8.0, 95, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (10, '少年派的奇幻漂流', '李安', 2012, '冒险', 8.0, 127, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (11, '流浪地球', '郭帆', 2019, '科幻', 7.9, 125, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (12, '饮食男女', '李安', 1994, '剧情', 7.9, 123, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (13, '无问西东', '李芳芳', 2018, '剧情', 7.6, 135, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (14, '盗墓笔记', '李仁港', 2016, '冒险', 5.1, 124, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (15, '风声', '高群书', 2009, '悬疑', 7.9, 117, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (16, '亲爱的', '陈可辛', 2014, '剧情', 8.2, 118, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (17, '心花路放', '宁浩', 2014, '喜剧', 7.4, 104, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (18, '海上钢琴师', '朱塞佩·托纳多雷', 1998, '剧情', 8.6, 165, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (19, '少年', '李想', 2019, '剧情', 7.2, 100, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');
INSERT INTO `test`.`movies` (`id`, `title`, `director`, `release_year`, `genre`, `rating`, `duration`, `column`) VALUES (20, '茶馆', '谢晋', 1982, '剧情', 8.4, 120, 'CREATE TABLE `movies` (\n  `id` int NOT NULL AUTO_INCREMENT COMMENT \'主键\',\n  `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT \'电影名\',\n  `director` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'导演\',\n  `release_year` int DEFAULT NULL COMMENT \'上映年份\',\n  `genre` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT \'类型\',\n  `rating` decimal(3,1) DEFAULT NULL COMMENT \'评分\',\n  `duration` int DEFAULT NULL COMMENT \'电影时长\',\n  PRIMARY KEY (`id`)\n) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;');

接口配置

生成完数据后还需要写一个接口来处理请求,直接ai生成python程序,生成完运行即可:

注意:代码开头与末尾需替换为自己(数据库)的IP

from flask import Flask, request, jsonify
import pymysql

# 数据库配置
DATABASE_CONFIG = {
    'host': '你的ip',
    'port': 3306,
    'user': '账号',
    'password': '密码',
    'db': '数据库名',
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
}
app = Flask(__name__)

@app.route('/query', methods=['POST'])
def query_database():
    print("接收到请求")
    # 获取查询sql
    querySql = request.json.get('querySql')
    print("querySql为:" + querySql)
    
    if querySql:
        # 去除 Markdown 标识和不必要的字符
        querySql = querySql.replace('```sql\n', '').replace('\n<<EOF>>', '')
        querySql = querySql.strip()
        querySql = querySql.replace('\n', ' ').replace('```', ' ')
        querySql = ' '.join(querySql.split())

        if not querySql:
            return jsonify({"error": "querySql is required"}), 400

        try:
            # 建立数据库连接
            connection = pymysql.connect(**DATABASE_CONFIG)
            with connection.cursor() as cursor:
                # 执行查询
                cursor.execute(querySql)
                result = cursor.fetchall()

            connection.commit()
            connection.close()

            if not result:
                return jsonify({"error": "未查询到有效数据"}), 400

            # 生成 Markdown 表格
            markdown_table = generate_markdown_table(result)

            return markdown_table, 200

        except Exception as e:
            print("数据库错误: ", e)
            return jsonify({"error": str(e)}), 500

def generate_markdown_table(results):
    """ 生成 Markdown 表格 """
    if not results:
        return ""
    # 获取列名
    columns = results[0].keys()

    # 表头
    table_md = "| " + " | ".join([col for col in columns]) + " |\n"
    # 分隔线
    table_md += "| " + " --- |" * len(columns) + "\n"

    # 表格内容
    for row in results:
        table_md += "| " + " | ".join([str(cell) for cell in row.values()]) + " |\n"

    return table_md

if __name__ == '__main__':
    app.run(host='localhost', port=5000)

本地知识库

将刚才生成的表的建表语句导入到dify知识库中

新建知识库

导入建表语句

设置知识库参数

创建应用

完成即可开始创建应用:点击工作室--新建空白应用。

我这里有就不再新建了,在开始后面加上知识检索,即本地知识库,在这里添加

在知识检索后点加号添加 LLM 配置如下:

提示词:

你是一个SQL专家或数据分析师,根据检索到{{#context#}}以及用户输入的{{#sys.query#}}需求,生成对应的查询sql,sql必须经过严格的校验。
#硬性要求
1.严格使用检素到的表字段
2.确保MySQL语法兼容
3.一定要在生成的sql前后各加一个$符号
4.仅输出最终结果sql语句的txt文本,不要加任何信息
5.禁止中问过程输出
6.sql中不要查询column列(如果有)

经过测试,虽然提示词中不允许生成除了 sql 以外的内容,但 deepseek 在此处生成 sql 时总会夹杂一些文字,所以要在提示词中加上 “一定要在生成的sql前后各加一个$符号” 便于后续处理。

在LLM后点加号,添加一个代码执行,在代码执行中需要将LLM返回的字符串截取为纯 sql :

代码执行中的JS代码:

function main(input) {
    // 检查输入是否为对象并且包含 input 字段
    if (typeof input === 'object' && input !== null && input.input) {
        const text = input.input;
        
        // 查找最后两个 $ 符号的位置
        const dollarStartIndex = text.lastIndexOf("$");
        const dollarEndIndex = text.lastIndexOf("$", dollarStartIndex - 1);
        
        if (dollarStartIndex !== -1 && dollarEndIndex !== -1) {
            // 获取两个 $ 符号之间的内容
            const content = text.substring(dollarEndIndex + 1, dollarStartIndex);
            return { result: content };
        } else {
            return { error: "输入的字符串没有正确的 $ 符号" };
        }
    } else {
        return { error: "输入必须是对象且包含 input 字段" };
    }
}

在代码执行后点加号,添加一个http请求,该请求会将上一步生成的 sql 发送给 python 接口,配置如下:

最后一步,在http请求后加上直接回复,把查询结果返回

最后点击预览,输入问题即可回答。

注意:在使用前要将python文件运行起来

这里我的模型反馈时间有点慢,不过好在能运行出来。

<think>好的,用户的问题是关于如何结合DEEPSEEK和DIFYMySQL实现自动查询及结果自动打印的功能。首先,我需要理解用户提到的各个组件及其作用。 DEEPSEEK可能指的是深度求索公司的AI服务,可能提供自然语言处理或代码生成能力。DIFY是一个开源的AI应用开发平台,允许用户构建和部署AI工作流。而MySQL是常用的关系型数据库。用户想要将这三者结合起来,实现自动化查询和结果打印。 接下来,我需要考虑可能的实现步骤。首先,用户可能需要通过DIFY来设计一个工作流,触发自动查询的条件,比如定时任务或特定事件。然后,利用DEEPSEAK的API处理自然语言查询,将其换为SQL语句。接着,执行SQL查询MySQL数据库,获取结果后,再通过某种方式输出,比如邮件、文件或打印到控制台。 需要注意的要点包括:如何安全地连接MySQL数据库,可能需要JDBC驱动和正确的连接参数,比如时区设置,如引用[1]提到的serverTimezone=Asia/Shanghai。此外,引用[2]提到DIFY有预设应用和API密钥管理,可能需要配置APIKEY来调用DEEPSEEK的服务。 可能的实现方案是,在DIFY中创建智能体,使用DEEPSEEK的API生成SQL,然后通过Python脚本执行查询并处理结果。同时,要确保数据库连接的安全性和错误处理机制。用户可能需要编写代码或使用DIFY的插件机制来实现这些步骤。 最后,用户可能还需要考虑性能优化、权限管理和日志记录等方面,确保系统稳定可靠。需要检查是否有相关文档或社区支持,以解决在集成过程中遇到的问题。</think>### 使用 DEEPSEEK 和 DIFY 实现 MySQL 自动查询及打印 #### 一、技术架构设计 1. **DIFY 工作流**:通过 DIFY 平台构建自动化流程,支持自然语言 SQL 查询和结果处理 2. **DEEPSEEK API**:调用其 NLP 能力将自然语言请求换为结构化 SQL 语句 3. **MySQL 连接**:使用 Python 的 `mysql.connector` 或 SQLAlchemy 实现数据库交互,注意时区配置(如 `serverTimezone=Asia/Shanghai`)[^1] #### 二、具体实现步骤 **1. 环境准备** ```python # 安装依赖库 pip install dify-client deepseek-api mysql-connector-python ``` **2. DIFY 智能体配置**(参考控制台预设应用[^2]) ```python from dify_client import DifyClient dify = DifyClient(api_key="YOUR_API_KEY") agent = dify.get_agent("mysql_query_printer") ``` **3. 自然语言 SQL** ```python def generate_sql(nl_query): prompt = f"将以下需求换为MySQL查询语句:\n{nl_query}" response = deepseek.generate(prompt) return extract_sql(response) # 需要添加SQL解析逻辑 ``` **4. MySQL 查询执行** ```python import mysql.connector def execute_query(sql): conn = mysql.connector.connect( host="localhost", user="root", password="your_password", database="your_db", port=3306, charset='utf8mb4', connect_timeout=5, client_flags=[mysql.connector.ClientFlag.SSL], ssl_ca='/path/to/ca.pem', ssl_verify_cert=True ) cursor = conn.cursor(dictionary=True) cursor.execute(sql) return cursor.fetchall() ``` **5. 自动化打印模块** ```python def print_results(data, format='table'): if format == 'json': print(json.dumps(data, indent=2)) else: from tabulate import tabulate print(tabulate(data, headers="keys")) ``` #### 三、安全增强措施 1. SQL 注入防护: ```python # 使用参数化查询 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,)) ``` 2. 权限控制: ```shell -- 创建专用数据库用户 CREATE USER 'dify_bot'@'%' IDENTIFIED BY 'strong_password'; GRANT SELECT ON your_db.* TO 'dify_bot'@'%'; ``` #### 四、完整工作流示例 ```python def auto_mysql_query(nl_request): try: sql = generate_sql(nl_request) # 调用DEEPSEEK results = execute_query(sql) # 执行查询 print_results(results) # 格式化输出 return {"status": "success", "data": results} except Exception as e: return {"status": "error", "message": str(e)} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值