224 lines
4.8 KiB
Markdown
224 lines
4.8 KiB
Markdown
# PostgreSQL到达梦数据库SQL转换工具
|
||
|
||
自动将PostgreSQL导出的SQL文件转换为达梦数据库(DM8)兼容的SQL语法。
|
||
|
||
## 功能特性
|
||
|
||
- ✅ 自动转换数据类型 (int8→BIGINT, int4→INT, int2→SMALLINT等)
|
||
- ✅ 序列(SEQUENCE)转换为IDENTITY自增列
|
||
- ✅ 移除PostgreSQL特有的COLLATE子句
|
||
- ✅ 简化索引语法 (移除USING btree, 操作符类等)
|
||
- ✅ 智能处理COALESCE函数索引
|
||
- ✅ 生成详细的转换日志
|
||
- ✅ 警告复杂索引可能超过达梦816字符限制
|
||
|
||
## 安装
|
||
|
||
```bash
|
||
cd pg2dm-converter
|
||
npm install
|
||
```
|
||
|
||
## 使用方法
|
||
|
||
### 1. 单文件转换
|
||
|
||
```bash
|
||
# 基本用法
|
||
node converter.js input/your_schema.sql
|
||
|
||
# 输出: output/your_schema_dm.sql
|
||
```
|
||
|
||
### 2. 指定输出文件
|
||
|
||
```bash
|
||
node converter.js input/schema.sql output/custom_output.sql
|
||
```
|
||
|
||
### 3. 批量转换
|
||
|
||
```bash
|
||
# 转换input目录下所有SQL文件
|
||
node converter.js input/*.sql
|
||
```
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
pg2dm-converter/
|
||
├── converter.js # 主转换程序
|
||
├── config.js # 转换规则配置
|
||
├── package.json # npm配置文件
|
||
├── README.md # 说明文档
|
||
├── input/ # 放置待转换的SQL文件
|
||
└── output/ # 输出转换后的文件
|
||
```
|
||
|
||
## 转换规则
|
||
|
||
### 1. 数据类型映射
|
||
|
||
| PostgreSQL | 达梦(DM8) |
|
||
|-----------|----------|
|
||
| int8 | BIGINT |
|
||
| int4 | INT |
|
||
| int2 | SMALLINT |
|
||
| numeric | DECIMAL |
|
||
| bool | BIT |
|
||
|
||
### 2. 序列转换
|
||
|
||
**转换前 (PostgreSQL):**
|
||
```sql
|
||
"id" int8 NOT NULL DEFAULT nextval('"schema".seq_name'::regclass)
|
||
```
|
||
|
||
**转换后 (达梦):**
|
||
```sql
|
||
"id" BIGINT IDENTITY(1, 1) NOT NULL
|
||
```
|
||
|
||
### 3. 索引语法简化
|
||
|
||
**转换前 (PostgreSQL):**
|
||
```sql
|
||
CREATE INDEX idx_name ON table_name USING btree (
|
||
"column1" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
|
||
);
|
||
```
|
||
|
||
**转换后 (达梦):**
|
||
```sql
|
||
CREATE INDEX idx_name ON table_name (
|
||
"column1"
|
||
);
|
||
```
|
||
|
||
### 4. COALESCE函数索引处理
|
||
|
||
如果索引包含过多COALESCE函数(默认>4个),工具会:
|
||
- 自动移除COALESCE包装,保留原始列名
|
||
- 在日志中发出警告
|
||
- 在转换日志中记录详细信息
|
||
|
||
**示例:**
|
||
|
||
转换前:
|
||
```sql
|
||
CREATE UNIQUE INDEX idx ON table(
|
||
COALESCE("col1", '-999'),
|
||
COALESCE("col2", '-999'),
|
||
...
|
||
);
|
||
```
|
||
|
||
转换后:
|
||
```sql
|
||
CREATE UNIQUE INDEX idx ON table(
|
||
"col1",
|
||
"col2",
|
||
...
|
||
);
|
||
```
|
||
|
||
## 转换日志
|
||
|
||
每次转换会生成两个文件:
|
||
|
||
1. **SQL文件**: `output/filename_dm.sql` - 转换后的SQL脚本
|
||
2. **日志文件**: `output/filename_dm_conversion.log.json` - 详细转换日志
|
||
|
||
日志文件包含:
|
||
```json
|
||
{
|
||
"timestamp": "2025-11-15T12:00:00.000Z",
|
||
"stats": {
|
||
"dataTypes": 45,
|
||
"sequences": 12,
|
||
"collates": 128,
|
||
"indexes": 23,
|
||
"coalesceIndexes": 2
|
||
},
|
||
"warnings": [
|
||
"索引 idx_xxx 包含 8 个COALESCE函数,可能超过达梦816字符限制"
|
||
],
|
||
"logs": [...]
|
||
}
|
||
```
|
||
|
||
## 配置文件
|
||
|
||
修改 `config.js` 可以自定义转换规则:
|
||
|
||
```javascript
|
||
module.exports = {
|
||
// 数据类型映射
|
||
dataTypeMapping: {
|
||
'int8': 'BIGINT',
|
||
// ... 更多映射
|
||
},
|
||
|
||
// COALESCE函数警告阈值
|
||
coalesceThreshold: 4,
|
||
|
||
// 达梦函数索引长度限制
|
||
functionIndexMaxLength: 816,
|
||
|
||
// 输出选项
|
||
output: {
|
||
addConversionComment: true,
|
||
generateLog: true,
|
||
warningOnComplexIndex: true
|
||
}
|
||
};
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **备份原始文件**: 转换前请备份原始PostgreSQL SQL文件
|
||
2. **检查转换结果**: 转换后建议人工检查关键表和索引定义
|
||
3. **测试执行**: 在测试环境先执行转换后的SQL,确认无误后再应用到生产环境
|
||
4. **复杂索引**: 对于警告的复杂索引,建议手动检查是否需要优化
|
||
5. **函数索引**: 达梦对函数索引表达式有816字符限制,注意日志中的警告
|
||
|
||
## 常见问题
|
||
|
||
### Q: 转换后的SQL能直接在达梦数据库执行吗?
|
||
|
||
A: 大部分情况可以,但建议:
|
||
- 检查转换日志中的警告信息
|
||
- 复杂的函数索引可能需要手动调整
|
||
- 某些PostgreSQL特有功能需要人工适配
|
||
|
||
### Q: 如何处理转换日志中的警告?
|
||
|
||
A: 警告通常涉及:
|
||
- 复杂COALESCE索引:已自动简化,但需确认业务逻辑
|
||
- 超长函数索引:需要手动拆分或使用虚拟列
|
||
|
||
### Q: 工具支持哪些PostgreSQL版本?
|
||
|
||
A: 测试覆盖PostgreSQL 12-16,理论上支持所有使用标准SQL导出的版本
|
||
|
||
## 示例
|
||
|
||
完整示例见 `d:\scp_custom_planning_item_dm.sql`
|
||
|
||
## 更新日志
|
||
|
||
- v1.0.0 (2025-11-15)
|
||
- 初始版本
|
||
- 支持基本数据类型转换
|
||
- 支持序列转IDENTITY
|
||
- 支持索引语法简化
|
||
- 支持COALESCE函数索引处理
|
||
|
||
## 许可证
|
||
|
||
MIT License
|
||
|
||
## 技术支持
|
||
|
||
遇到问题请检查转换日志文件,日志中包含详细的转换步骤和警告信息。
|