pg2dm-converter/README.md
dengqichen aff0ac1d52 init
2025-11-15 13:28:14 +08:00

224 lines
4.8 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.

# 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
## 技术支持
遇到问题请检查转换日志文件,日志中包含详细的转换步骤和警告信息。