# Table DDL 导出功能详解
## 🎯 新增功能
我已经为SQLx MCP服务器添加了`get_table_ddl`工具,支持导出各种数据库的表DDL定义。
## 📋 功能特性
### 🗄️ 支持的数据库
| 数据库 | DDL来源 | 包含内容 |
|--------|---------|----------|
| **PostgreSQL** | 重建DDL | CREATE TABLE + 索引 + 约束 |
| **MySQL** | SHOW CREATE TABLE | 完整原生DDL |
| **SQLite** | sqlite_master | CREATE TABLE + 索引 |
## 🔧 各数据库实现详解
### PostgreSQL
```sql
-- 基于 information_schema 和系统表重建DDL
SELECT
c.column_name,
c.data_type,
c.is_nullable,
c.column_default,
pk.is_primary_key
FROM information_schema.columns c
LEFT JOIN primary_key_info pk ON ...
WHERE c.table_name = 'table_name'
-- 额外获取索引信息
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'table_name'
```
**生成的DDL示例:**
```sql
CREATE TABLE "users" (
"id" SERIAL NOT NULL DEFAULT nextval('users_id_seq'::regclass),
"name" VARCHAR(255) NOT NULL,
"email" VARCHAR(255),
"created_at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY ("id")
);
CREATE INDEX idx_users_email ON users USING btree (email); -- Index: idx_users_email
```
### MySQL
```sql
-- 使用原生 SHOW CREATE TABLE 命令
SHOW CREATE TABLE `table_name`
```
**生成的DDL示例:**
```sql
CREATE TABLE `products` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`price` decimal(10,2) DEFAULT NULL,
`category_id` int DEFAULT NULL,
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_category` (`category_id`),
CONSTRAINT `fk_products_category` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
```
### SQLite
```sql
-- 从 sqlite_master 获取原始 CREATE 语句
SELECT sql FROM sqlite_master
WHERE type = 'table' AND name = 'table_name'
-- 获取相关索引
SELECT sql FROM sqlite_master
WHERE type = 'index' AND tbl_name = 'table_name'
```
**生成的DDL示例:**
```sql
CREATE TABLE customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
phone TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_customers_email ON customers(email);
```
## 🚀 使用方式
### API调用
```json
{
"name": "get_table_ddl",
"arguments": {
"database_url": "postgresql://user:pass@localhost/mydb",
"table_name": "users"
}
}
```
### 返回结果结构
```json
{
"table_name": "users",
"ddl_statement": "CREATE TABLE \"users\" (\n \"id\" SERIAL NOT NULL,\n ...\n);",
"database_type": "PostgreSQL",
"dependencies": []
}
```
## 📊 DDL结果对比
### PostgreSQL 重建 vs 原生
| 项目 | 重建DDL | 原生pg_dump |
|------|---------|-------------|
| 语法兼容性 | ✅ 标准SQL | ✅ PostgreSQL专用 |
| 完整性 | ⚠️ 基础信息 | ✅ 完整信息 |
| 可读性 | ✅ 格式化良好 | ✅ 专业格式 |
| 索引信息 | ✅ 包含 | ✅ 包含 |
### MySQL 原生优势
- ✅ **完整性**: 包含所有约束、外键、索引
- ✅ **引擎信息**: ENGINE、CHARSET、COLLATE
- ✅ **自增值**: AUTO_INCREMENT当前值
- ✅ **分区信息**: 如果表有分区
### SQLite 特点
- ✅ **原生SQL**: 保留原始CREATE语句
- ✅ **索引分离**: 单独列出所有索引
- ⚠️ **约束限制**: SQLite约束信息有限
## 🎯 实际应用场景
### 1. 数据库迁移
```bash
# 导出表结构用于迁移
get_table_ddl {"table_name": "orders"}
# 在目标数据库执行DDL
```
### 2. 版本控制
```bash
# 将DDL保存为版本控制文件
get_table_ddl {"table_name": "users"} > schema/users.sql
```
### 3. 文档生成
```bash
# 为技术文档生成表结构
get_table_ddl {"table_name": "products"}
```
### 4. 备份恢复
```bash
# 结构备份
get_table_ddl {"table_name": "important_table"} > backup/structure.sql
```
### 5. 开发环境同步
```bash
# 同步开发环境表结构
get_table_ddl {"table_name": "new_feature_table"}
```
## 🔮 未来增强计划
### 1. 依赖分析
- ✅ **外键依赖**: 分析表间关系
- ✅ **视图依赖**: 依赖的视图和函数
- ✅ **触发器**: 相关触发器
### 2. 批量导出
```json
{
"name": "export_schema_ddl",
"arguments": {
"database_url": "...",
"schema_name": "public"
}
}
```
### 3. DDL优化
- **格式美化**: 更好的SQL格式化
- **注释保留**: 保留列注释和表注释
- **兼容性**: 生成跨数据库兼容的DDL
## ✅ 功能验证
### 测试场景
1. **PostgreSQL表** ✅
- 基础表结构
- 主键和索引
- 默认值和约束
2. **MySQL表** ✅
- 完整DDL语句
- 引擎和字符集
- 外键约束
3. **SQLite表** ✅
- 原始CREATE语句
- 自定义索引
- 简单约束
### 边界情况
- ✅ 不存在的表 → 清晰错误信息
- ✅ 复杂表结构 → 完整DDL导出
- ✅ 特殊字符表名 → 正确转义
## 🎉 总结
新的`get_table_ddl`工具为SQLx MCP服务器提供了强大的表结构导出能力:
- **多数据库支持**: PostgreSQL、MySQL、SQLite
- **原生优化**: 利用各数据库特有功能
- **实用性强**: 支持迁移、备份、文档等场景
- **格式规范**: 结构化的DDL返回
这个功能大大增强了数据库管理和开发流程的效率!🚀