LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果

请添加图片描述

安装依赖

pip install --upgrade --quiet  langchain-core langchain-community langchain-openai

编写代码

from langchain_core.prompts import ChatPromptTemplate
from langchain_community.utilities import SQLDatabase
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI


template = """Based on the table schema below, write a SQL query that would answer the user's question:
{schema}

Question: {question}
SQL Query:"""
prompt = ChatPromptTemplate.from_template(template)


db = SQLDatabase.from_uri("sqlite:///./Chinook.db")


def get_schema(_):
    return db.get_table_info()


def run_query(query):
    return db.run(query)


model = ChatOpenAI(
    model="gpt-3.5-turbo",
)

sql_response = (
    RunnablePassthrough.assign(schema=get_schema)
    | prompt
    | model.bind(stop=["
SQLResult:"])
    | StrOutputParser()
)

template = """Based on the table schema below, question, sql query, and sql response, write a natural language response:
{schema}

Question: {question}
SQL Query: {query}
SQL Response: {response}"""
prompt_response = ChatPromptTemplate.from_template(template)

full_chain = (
    RunnablePassthrough.assign(query=sql_response).assign(
        schema=get_schema,
        response=lambda x: db.run(x["query"]),
    )
    | prompt_response
    | model
)

message = full_chain.invoke({"question": "How many employees are there?"})
print(f"message: {message}")

运行结果

? python3 test09.py
message: content='There are a total of 8 employees in the database.' response_metadata={'finish_reason': 'stop', 'logprobs': None}

在这里插入图片描述

<think>嗯,用户想通过Dify的OpenAPI实现SQL数据库查询。首先,我需要回忆一下Dify的相关文档和之前了解的引用内容。根据引用[1]和[2],Dify支持自定义工具连接到MySQL数据库,用户可以通过编写Python服务来实现数据写入。那查询的话应该也是类似的流程,但需要调整代码来处理查询请求。 首先,用户需要创建一个自定义工具,用来处理SQL查询。根据引用[1],需要编写一个Python服务,生成OpenAPI的schema。这一步的关键是确保服务能够接收查询参数,执行SQL语句,返回结果。可能需要使用Python的数据库驱动,比如pymysql或者sqlalchemy,来连接数据库。 然后,用户需要在Dify中创建这个自定义工具,在工作流中调用它。引用[2]提到DB-GPT支持多种数据库类型,添加数据源时需要选择对应的类型,比如MySQL。所以,用户需要先在Dify中添加数据库连接,确保配置正确的主机、端口、用户名、密码和数据库名。 接下来,代码部分。用户需要处理GET或POST请求,接收查询参数,比如SQL语句或者其他条件。为了防止SQL注入,必须对输入进行严格的验证,或者使用参数化查询。返回结果应该是JSON格式,方便Dify后续处理。 生成OpenAPI的schema时,需要定义输入参数和响应结构。比如,输入可能包括数据库类型、查询语句,输出包括状态码、消息和查询结果的数据。 最后,测试整个流程,确保自定义工具能够正确执行查询返回结果。可能还需要考虑错误处理,比如数据库连接失败、查询语法错误等情况,返回相应的错误信息。 用户可能遇到的问题包括数据库连接配置错误、权限不足、SQL语句错误等,需要在文档中提供常见问题解答。此外,安全方面需要强调避免SQL注入,推荐使用参数化查询或ORM工具。</think>以下是使用 Dify OpenAPI 实现 SQL 数据库查询的分步指南: ### 一、环境准备 1. 在 Dify 中添加 MySQL 数据源 - 进入数据源管理界面,选择 MySQL 类型 - 填写连接参数: ```json { "host": "your_host", "port": 3306, "user": "db_user", "password": "db_password", "database": "target_db" } ``` - 测试连接成功后保存配置[^2] ### 二、创建自定义工具 1. 编写 Python 查询服务(示例代码): ```python from flask import Flask, request, jsonify import pymysql app = Flask(__name__) @app.route('/sql_query', methods=['POST']) def query_handler(): try: data = request.json query = data['query'] connection = pymysql.connect( host='your_host', user='db_user', password='db_password', database='target_db' ) with connection.cursor() as cursor: cursor.execute(query) result = cursor.fetchall() return jsonify({ "status": 200, "data": result, "columns": [desc[0] for desc in cursor.description] }) except Exception as e: return jsonify({"status": 500, "error": str(e)}) ``` 2. 创建 OpenAPI Schema 文件: ```yaml openapi: 3.0.0 info: title: SQL Query Service version: 1.0.0 paths: /sql_query: post: requestBody: content: application/json: schema: type: object properties: query: type: string responses: '200': description: Query result content: application/json: schema: type: object properties: status: type: integer data: type: array items: {} columns: type: array items: type: string ``` ### 三、Dify 配置流程 1. 创建自定义工具 - 进入「工具」→「自定义工具」 - 上传 OpenAPI Schema 文件 - 设置认证方式(建议使用 API Key) 2. 创建工作流 ```mermaid graph TD A[用户输入] --> B(文本处理节点) B --> C{是否需要数据库查询} C -->|是| D[SQL查询工具] C -->|否| E[结果输出] D --> F[数据处理节点] F --> E ``` ### 四、调用示例 通过 OpenAPI 发送请求: ```bash curl -X POST "https://api.dify.ai/v1/workflows/run" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "inputs": { "query": "SELECT * FROM orders WHERE status = 'pending'" } }' ``` ### 五、安全注意事项 1. 使用参数化查询防止 SQL 注入 2. 设置数据库只读账号权限 3. 限制查询结果最大返回行数(建议添加 LIMIT 子句自动补全)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值