Files
aiagent/数据库查询工具实现总结.md
2026-03-06 22:31:41 +08:00

206 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据库查询工具实现总结
## ✅ 完成状态
**任务**: 数据库查询工具实现
**状态**: ✅ 已完成
**完成时间**: 2026-01-23
---
## 📋 实现功能
### 1. 核心功能
-**默认数据库查询**
- 使用SQLAlchemy连接默认数据库
- 支持所有SELECT查询操作
- 自动格式化查询结果为JSON
-**指定数据源查询**
- 支持通过`data_source_id`参数查询外部数据库
- 自动使用数据源连接器MySQL、PostgreSQL等
- 支持多种数据库类型
-**SQL注入防护**
- 只允许SELECT查询
- 禁止INSERT、UPDATE、DELETE、DROP等危险操作
- 检查危险关键字INSERT、UPDATE、DELETE、DROP、TRUNCATE、ALTER等
- 禁止多语句查询
- 自动清理SQL注释
-**查询超时控制**
- 默认超时时间30秒
- 最大超时时间300秒
- 使用asyncio实现异步超时控制
-**结果格式化**
- 返回JSON格式结果
- 包含查询状态、行数、数据内容
- 自动处理日期时间等特殊类型
---
## 🔧 技术实现
### 文件修改
1. **`backend/app/services/builtin_tools.py`**
- 实现 `database_query_tool` 函数
- 实现 `_validate_sql_query` SQL验证函数
- 实现 `_execute_default_db_query` 默认数据库查询
- 实现 `_execute_data_source_query` 数据源查询
- 更新 `DATABASE_QUERY_SCHEMA` 工具定义
2. **`backend/app/main.py`**
- 注册 `database_query_tool` 到工具注册表
### 核心代码
```python
async def database_query_tool(
query: str,
database: str = "default",
data_source_id: Optional[str] = None,
timeout: int = 30
) -> str:
"""
数据库查询工具
- 只允许SELECT查询
- 支持默认数据库和指定数据源
- 包含SQL注入防护和超时控制
"""
```
---
## 🧪 测试结果
### 测试用例
1.**SQL验证测试**
- 正常SELECT查询 ✅
- INSERT/UPDATE/DELETE/DROP查询被拒绝 ✅
- 多语句查询被拒绝 ✅
- 带WHERE和别名的复杂查询 ✅
2.**数据库查询测试**
- 默认数据库查询成功 ✅
- SQL注入防护生效 ✅
- 复杂SELECT查询成功 ✅
- 超时控制生效 ✅
### 测试脚本
- 文件: `test_database_query_tool.py`
- 所有测试用例通过 ✅
---
## 📊 工具Schema
```json
{
"type": "function",
"function": {
"name": "database_query",
"description": "执行数据库查询只允许SELECT查询支持默认数据库和指定数据源",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "SQL查询语句只允许SELECT查询"
},
"data_source_id": {
"type": "string",
"description": "数据源ID可选如果提供则使用指定的数据源"
},
"timeout": {
"type": "integer",
"description": "查询超时时间默认30秒最大300秒",
"default": 30,
"minimum": 1,
"maximum": 300
}
},
"required": ["query"]
}
}
}
```
---
## 🔒 安全特性
1. **SQL注入防护**
- 只允许SELECT查询
- 关键字黑名单检查
- 禁止多语句执行
2. **超时控制**
- 防止长时间运行的查询
- 可配置超时时间
3. **错误处理**
- 详细的错误信息
- 不泄露敏感信息
---
## 📝 使用示例
### 示例1: 查询默认数据库
```python
result = await database_query_tool(
query="SELECT id, username, email FROM users LIMIT 10",
timeout=30
)
```
### 示例2: 查询指定数据源
```python
result = await database_query_tool(
query="SELECT * FROM products WHERE price > 100",
data_source_id="your-data-source-id",
timeout=60
)
```
### 示例3: 在LLM节点中使用
在LLM节点的工具配置中启用 `database_query` 工具LLM可以自动调用
```
用户: "查询一下有多少个用户"
LLM: 调用 database_query(query="SELECT COUNT(*) as count FROM users")
```
---
## 🎯 下一步
根据待完善功能清单,接下来可以:
1. **工具调用可视化** - 显示工具调用过程
2. **监控和告警前端界面** - 后端API已完成需要前端实现
3. **工具动态注册机制** - 支持HTTP工具、工作流工具的动态注册
---
## 📊 统计
- **代码行数**: 约200行
- **测试用例**: 8个
- **测试通过率**: 100%
- **工具总数**: 9个新增1个
---
**最后更新**: 2026-01-23
**文档版本**: v1.0