# TextToSQL
**Repository Path**: li-xu-289/text-to-sql
## Basic Information
- **Project Name**: TextToSQL
- **Description**: TextToSQL是一个开源工具,允许用户使用自然语言查询数据库。它通过模型上下文协议(MCP)利用AI能力来解释用户查询,生成适当的SQL语句,并在数据库上执行它们。
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 53
- **Forks**: 8
- **Created**: 2025-08-13
- **Last Updated**: 2026-02-04
## Categories & Tags
**Categories**: database-dev
**Tags**: None
## README
TextToSQL v2.0.0
基于MCP协议的多数据库自然语言查询工具,直接用对话方式获取数据库信息,无需编写SQL!
[English](README.md) | [中文简体](README_CN.md)
## 官网:TextToSQL
## v2.0 新特性
- **多数据库支持**:同时连接和查询多个数据库
- **YAML配置**:简洁清晰的配置文件格式
- **连接池管理**:使用DBUtils高效管理数据库连接
- **双层缓存**:内存(L1) + 文件(L2)缓存,优化性能
- **安全增强**:SQL校验防止危险操作
- **分层架构**:清晰的关注点分离,便于维护
## 概述
TextToSQL是一个开源工具,允许用户使用自然语言查询数据库。它通过模型上下文协议(MCP)利用AI能力来解释用户查询,生成适当的SQL语句,并在多个数据库上执行。
## 特性
- **自然语言查询**:使用普通中文或英文查询您的数据库
- **多数据库支持**:配置并在多个数据库之间切换
- **SQL生成**:自动将自然语言转换为优化的SQL查询
- **智能缓存**:双层缓存(内存+文件),自动刷新
- **连接池管理**:为每个数据库高效管理连接
- **支持复杂查询**:处理JOIN、子查询、聚合等
- **安全优先**:仅允许SELECT查询,阻止危险操作
## 架构
```
texttosql/
├── main.py # MCP服务入口
├── config.yaml # 数据库配置(从示例创建)
├── config.yaml.example # 配置模板
├── requirements.txt # Python依赖
│
├── config/ # 配置管理
│ └── settings.py # YAML配置加载器
│
├── services/ # 业务逻辑层
│ ├── database_manager.py # 多数据库连接管理
│ ├── schema_service.py # 表结构与缓存
│ └── query_service.py # SQL查询执行
│
├── repositories/ # 数据访问层
│ └── mysql_repository.py # MySQL连接池
│
└── utils/ # 工具函数
├── sql_validator.py # SQL安全校验
└── response_formatter.py # 响应格式化
```
## 安装
### 前提条件
- Python 3.8或更高版本
- 访问MySQL/MariaDB数据库的权限
### 设置
1. 克隆仓库:
```bash
git clone https://gitee.com/li-xu-289/text-to-sql.git
cd text-to-sql
```
2. 安装依赖:
```bash
pip install -r requirements.txt
```
3. 创建配置文件:
```bash
cp config.yaml.example config.yaml
```
4. 编辑 `config.yaml` 填写您的数据库凭据:
```yaml
databases:
- name: "生产库"
alias: "prod"
host: "your-host"
port: 3306
database: "your_database"
username: "your_username"
password: "your_password"
default_database: "prod"
```
## 使用方法
### 启动MCP服务器
```bash
python main.py
```
### 在Claude Desktop或其他MCP客户端中配置:
```json
{
"mcpServers": {
"TextToSQL Bot": {
"command": "python",
"args": ["/path/to/texttosql/main.py"],
"transport": "stdio"
}
}
}
```
### 查询示例
- "显示IT部门的所有员工"
- "按部门统计平均薪资是多少?"
- "查找过去3个月内下单的客户"
- "列出销售量前5的产品"
- "切换到测试数据库,显示所有表"
## MCP工具
系统通过MCP接口提供三个工具:
### list_databases
列出所有配置的数据库及连接状态。
```python
# 返回可用数据库列表
list_databases()
# 响应: {"databases": [{"name": "生产库", "alias": "prod", ...}], "count": 2}
```
### get_table_schema
获取数据库结构信息,带智能缓存。
```python
# 获取默认数据库的所有表
get_table_schema()
# 获取指定数据库的所有表
get_table_schema(database="prod")
# 获取指定表的字段信息
get_table_schema(table_name="employees")
# 获取指定数据库中某张表的字段
get_table_schema(database="test", table_name="orders")
```
### query_database
执行SQL SELECT查询(INSERT/UPDATE/DELETE被阻止)。
```python
# 简单查询
query_database("SELECT * FROM employees WHERE department = 'IT'")
# 带限制的查询
query_database("SELECT * FROM logs", database="logs", limit=50)
# 复杂JOIN查询
query_database("""
SELECT e.name, d.department_name, e.salary
FROM employees e
JOIN departments d ON e.dept_id = d.id
WHERE e.salary > 50000
""", limit=20)
```
## 配置说明
### config.yaml 结构
```yaml
# 数据库配置列表
databases:
- name: "生产库" # 显示名称
alias: "prod" # 别名(API调用使用)
host: "192.168.1.100" # 数据库主机
port: 3306 # 端口号
database: "business_db" # 数据库名
username: "app_user" # 用户名
password: "secure_password" # 密码
charset: "utf8mb4" # 字符集
max_connections: 10 # 连接池大小
- name: "测试库"
alias: "test"
host: "192.168.1.101"
# ... 其他配置
# 默认数据库(未指定时使用)
default_database: "prod"
# 缓存配置
cache:
ttl_seconds: 3600 # 内存缓存过期时间(1小时)
file_ttl_seconds: 86400 # 文件缓存过期时间(24小时)
cache_dir: "cache" # 缓存目录
cache_file: "schema_cache.json" # 缓存文件名
```
## 安全特性
- **仅限SELECT**:只允许SELECT查询
- **SQL注入防护**:参数化查询和校验
- **危险关键字拦截**:DROP、DELETE、INSERT、UPDATE、TRUNCATE、ALTER等
- **注释拦截**:不允许SQL注释(-- 和 /* */)
- **多语句拦截**:只允许单条语句
## 许可证
该项目采用MIT许可证 - 详情请参阅LICENSE文件。
## 贡献
欢迎贡献!请随时提交Pull Request。
## 联系与支持
### 联系我
### 支持本项目
