自动化数据库逆向工程工具,用于从PostgreSQL数据库生成vanna.ai格式的训练数据。
pip install asyncpg asyncio
python -m schema_tools \
--db-connection "postgresql://user:pass@localhost:5432/dbname" \
--table-list tables.txt \
--business-context "高速公路服务区管理系统"
python -m schema_tools \
--db-connection "postgresql://user:pass@localhost:5432/dbname" \
--table-list tables.txt \
--business-context "电商系统" \
--output-dir ./output \
--pipeline full
python -m schema_tools \
--db-connection "postgresql://user:pass@localhost:5432/dbname" \
--check-permissions-only
import asyncio
from schema_tools import SchemaTrainingDataAgent
async def generate_training_data():
agent = SchemaTrainingDataAgent(
db_connection="postgresql://user:pass@localhost:5432/dbname",
table_list_file="tables.txt",
business_context="高速公路服务区管理系统",
output_dir="./output",
pipeline="full"
)
report = await agent.generate_training_data()
print(f"处理完成: {report['summary']}")
asyncio.run(generate_training_data())
创建一个文本文件(如 tables.txt
),每行一个表名:
# 这是注释行
public.users
public.orders
hr.employees
sales.products
output/
├── ddl/ # DDL文件目录
│ ├── users.ddl
│ ├── orders.ddl
│ └── hr__employees.ddl
├── docs/ # MD文档目录
│ ├── users_detail.md
│ ├── orders_detail.md
│ └── hr__employees_detail.md
├── logs/ # 日志目录
│ └── schema_tools_20240101_120000.log
└── filename_mapping.txt # 文件名映射报告
主要配置在 schema_tools/config.py
中:
SCHEMA_TOOLS_CONFIG = {
# 核心配置
"output_directory": "training/generated_data",
"default_pipeline": "full",
# 数据处理配置
"sample_data_limit": 20, # 采样数据量
"max_concurrent_tables": 3, # 最大并发数
# LLM配置
"max_llm_retries": 3, # LLM重试次数
"comment_generation_timeout": 30, # 超时时间
# 系统表过滤
"filter_system_tables": True, # 过滤系统表
# 错误处理
"continue_on_error": True, # 错误后继续
}
full: 完整处理链(默认)
ddl_only: 仅生成DDL
analysis_only: 仅分析不生成文件
业务上下文帮助LLM更好地理解表和字段的含义:
--business-context "高速公路服务区管理系统"
--business-context-file business_context.txt
编辑 schema_tools/prompts/business_dictionary.txt
:
BSS - Business Support System,业务支撑系统
SA - Service Area,服务区
POS - Point of Sale,销售点
from schema_tools.utils.system_filter import SystemTableFilter
filter = SystemTableFilter()
filter.add_custom_prefix("tmp_") # 添加自定义前缀
filter.add_custom_schema("temp") # 添加自定义schema
对于超过100万行的大表,自动使用分层采样策略:
自动检测并验证枚举字段:
A: 工具自动检测并适配只读数据库,不会尝试写操作。
A: 自动生成唯一文件名,如 hr__users.ddl
和 sales__users.ddl
。
A: 在表清单文件中注释掉(使用 # 开头)或删除相应行。
A: 自动重试3次,失败后使用原始注释或默认值。
@ToolRegistry.register("my_tool") class MyTool(BaseTool):
needs_llm = False
tool_name = "我的工具"
async def execute(self, context):
# 实现工具逻辑
return ProcessingResult(success=True)
2. 添加到处理链:
```python
"my_pipeline": [
"database_inspector",
"my_tool",
"ddl_generator"
]
本工具作为VANNA-CHAINLIT-CHROMADB项目的一部分,遵循项目许可证。