借助Dify连接MySQL数据库

借助Dify连接MySQL数据库

1、在本地搭建数据库访问服务并通过ngrok暴露至公网

在本地搭建能够访问数据库的服务,并且利用ngrok将该服务暴露到公网环境中。

#sql_tools.py

from flask import Flask, request, jsonify
import mysql.connector

# 数据库连接配置
config = {
    'user': 'your_username',
    'password': 'your_password',
    'host': 'localhost',
    'database': 'your_database',
    'raise_on_warnings': True
}

# 初始化Flask应用
app = Flask(__name__)

# 连接数据库
def connect_to_database():
    try:
        conn = mysql.connector.connect(**config)
        print("已连接到MySQL数据库")
        return conn
    except mysql.connector.Error as err:
        print(f"错误:{err}")
        return None

# 执行SQL查询
def execute_query(conn, sql):
    cursor = conn.cursor()
    try:
        cursor.execute(sql)
        if sql.strip().lower().startswith("select"):
            # 如果是查询操作,返回结果
            result = cursor.fetchall()
            return result
        else:
            # 如果是插入、更新、删除操作,提交事务并返回受影响的行数
            conn.commit()
            return cursor.rowcount
    except mysql.connector.Error as err:
        print(f"执行SQL时出错:{err}")
        return None
    finally:
        cursor.close()

# HTTP接口:执行SQL
@app.route('/execute', methods=['POST'])
def execute_sql():
    # 获取请求中的SQL语句
    data = request.json
    if not data or 'sql' not in data:
        return jsonify({"error": "需要SQL语句"}), 400

    sql = data['sql']
    conn = connect_to_database()
    if not conn:
        return jsonify({"error": "无法连接到数据库"}), 500

    # 执行SQL
    result = execute_query(conn, sql)
    conn.close()

    if result is None:
        return jsonify({"error": "执行SQL失败"}), 500

    # 返回结果
    return jsonify({"result": result})

# 启动Flask应用
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=3000)

2、创建知识库并导入表结构描述

创建一个知识存储的库,然后把表格结构的相关描述导入进去。

3、创建数据库访问工作流程

构建针对数据库访问的工作流程。

import requests
def main(sql: str) -> dict:
    # 定义API的URL
    url = "https://xxx.ngrok-free.app/execute"

    # 构造请求体
    payload = {
        "sql": sql
    }

    # 发送POST请求
    try:
        response = requests.post(url, json=payload)

        # 检查响应状态码
        if response.status_code == 200:
            # 解析响应数据
            result = response.json()
            return {
                "result": f"{result}"
            }
        else:
            return {
                "result": f"请求失败,状态码:{response.status_code},{response.json()}"
            }
    except requests.exceptions.RequestException as e:
        return {
            "result": f"请求异常:{e}"
        }

4、创建数据库智能体

构建数据库相关的智能体。

方法二:直接在执行代码中访问mysql

导入pymysql模块,定义执行SQL的函数以及主函数来调用。同时需要进行配置:
1、在dify/docker-legacy/volumes/sandbox/dependencies/python-requirements.txt中添加pymysql这个依赖项
2、在dify/docker/ssrf_proxy/squid.conf.template中添加对数据库IP及端口的访问权限。

参考:如果不是本地网络环境,可以使用devnet。

版权声明:程序员胖胖胖虎阿 发表于 2025年7月5日 上午8:11。
转载请注明:

借助Dify连接MySQL数据库

| 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...