自然语言转SQL查询执行器

一个智能系统,将自然语言问题转换为SQL查询并在Supabase PostgreSQL数据库上安全执行,适用于无需SQL知识的用户友好型数据分析。

  • by mitali-01
  • PLpgSQL
  • 本地部署
  • 更新于
在 GitHub 查看 mitali-01/MCP-DB-Query-Assistant

使用说明

AI驱动的SQL查询执行器

MCP+Supabase+拥抱面部+流光灯

一个智能系统,可以转换 将自然语言问题转化为SQL查询 并在 Supabase PostgreSQL 数据库。
由...驱动 MCP(模型上下文协议), 拥抱脸LLMs,现代 流线型UI.


概述

问以下问题:

“总收入排名前五的销售人员?”

该系统将:

  1. 使用A LLM(通过MCP) 转换自然语言→ SQL
  2. 通过安全机制执行SQL Supabase RPC
  3. 返回结构化结果 JSON 用于UI或分析

这提供了一个安全、用户友好的分析层,不需要SQL知识。


MCP集成

MCP(模型上下文协议) 充当LLM和数据库之间的安全桥梁。

MCP职责:

  • 转换用户意图→ SQL
  • 限制LLM直接访问数据库
  • 仅通过批准的路径路由SQL RPC 函数
  • 维护沙盒、受控执行

这确保了强大的安全性,同时保持了LLM的灵活性。


数据库模式

表: sales

列 类型 描述
id 序列(PK) 唯一记录id
地区 文本 销售地区
产品 文本 产品名称
价格 数字 单价
数量 整数 售出数量
日期 日期 交易日期
客户 文本 客户名称
销售人员 文本 销售人员处理销售

安全RPC功能

所有SQL都是通过受控RPC执行的:

create or replace function execute_raw_sql(query text)
returns json as $$
declare
    result json;
    clean_query text;
begin
    clean_query := trim(both ';' from query);
    execute 'select json_agg(t) from (' || clean_query || ') t' into result;
    return coalesce(result, '[]'::json);
exception
    when others then
        return json_build_object('error', SQLERRM);
end;

为什么这是安全的:

  • 仅运行SELECT查询
  • 删除不安全的分号
  • 防止SQL注入
  • 始终返回JSON

该仓库包含suabase_queries.sql,它:

  • 创建表格
  • 创建RPC
  • 插入约50个样本行

项目结构

Copy code
/
├── app.py              # Streamlit UI
├── main.py             # Backend logic: NLP → SQL → RPC
├── supabase_client.py  # Supabase connection helper
├── requirements.txt    # Dependencies
├── supabase_queries.sql
└── .env                # Credentials (not committed)

配置

使用以下命令创建.env文件:

SUPABASE_URL=<your_supabase_project_url>
SUPABASE_KEY=<your_supabase_anon_or_service_key>
HUGGINGFACE_API_KEY=<your_huggingface_token>
Supabase Init (supabase_client.py)
python
Copy code
supabase = create_client(os.getenv("SUPABASE_URL"), os.getenv("SUPABASE_KEY"))
response = supabase.rpc("execute_raw_sql", {"query": sql_query}).execute()

流线型前端

UI允许用户:

  • 输入自然语言问题
  • 查看生成的SQL
  • 以表格形式显示结果

运行项目

  1. 安装依赖项
pip install -r requirements.txt
  1. 配置环境变量
  • 从上面的模板创建.env。
  1. 启动后端服务
uvicorn main:app --reload
  1. 启动Streamlit用户界面
streamlit run app.py

示例输出

用户查询:

“按总销售额显示前5名销售人员”

系统响应:

{
  "query": "SELECT salesperson, SUM(price * quantity) AS total_sales
            FROM sales
            GROUP BY salesperson
            ORDER BY total_sales DESC
            LIMIT 5",
  "data": [
    { "salesperson": "Ananya Mehta", "total_sales": 1456000 },
    { "salesperson": "Ravi Kapoor", "total_sales": 1324000 }
  ]
}

未来的增强功能

  • 多表查询(产品、客户、地区)
  • 模式感知SQL提示
  • 查询日志和分析
  • 可视化图表和仪表板
  • 安全访问的用户身份验证

Loom视频链接:

https://www.loom.com/share/1618617288104c00a0e021a092bd0b2c