Go to file
dengqichen aff0ac1d52 init
2025-11-15 13:28:14 +08:00
input init 2025-11-15 13:28:14 +08:00
.gitignore init 2025-11-15 13:28:14 +08:00
config.js init 2025-11-15 13:28:14 +08:00
CONVERT_NOW.bat init 2025-11-15 13:28:14 +08:00
converter.js init 2025-11-15 13:28:14 +08:00
package-lock.json init 2025-11-15 13:28:14 +08:00
package.json init 2025-11-15 13:28:14 +08:00
README.md init 2025-11-15 13:28:14 +08:00
scp_simulation_scenario.sql init 2025-11-15 13:28:14 +08:00

PostgreSQL到达梦数据库SQL转换工具

自动将PostgreSQL导出的SQL文件转换为达梦数据库(DM8)兼容的SQL语法。

功能特性

  • 自动转换数据类型 (int8→BIGINT, int4→INT, int2→SMALLINT等)
  • 序列(SEQUENCE)转换为IDENTITY自增列
  • 移除PostgreSQL特有的COLLATE子句
  • 简化索引语法 (移除USING btree, 操作符类等)
  • 智能处理COALESCE函数索引
  • 生成详细的转换日志
  • 警告复杂索引可能超过达梦816字符限制

安装

cd pg2dm-converter
npm install

使用方法

1. 单文件转换

# 基本用法
node converter.js input/your_schema.sql

# 输出: output/your_schema_dm.sql

2. 指定输出文件

node converter.js input/schema.sql output/custom_output.sql

3. 批量转换

# 转换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):

"id" int8 NOT NULL DEFAULT nextval('"schema".seq_name'::regclass)

转换后 (达梦):

"id" BIGINT IDENTITY(1, 1) NOT NULL

3. 索引语法简化

转换前 (PostgreSQL):

CREATE INDEX idx_name ON table_name USING btree (
  "column1" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);

转换后 (达梦):

CREATE INDEX idx_name ON table_name (
  "column1"
);

4. COALESCE函数索引处理

如果索引包含过多COALESCE函数默认>4个工具会

  • 自动移除COALESCE包装保留原始列名
  • 在日志中发出警告
  • 在转换日志中记录详细信息

示例:

转换前:

CREATE UNIQUE INDEX idx ON table(
  COALESCE("col1", '-999'),
  COALESCE("col2", '-999'),
  ...
);

转换后:

CREATE UNIQUE INDEX idx ON table(
  "col1",
  "col2",
  ...
);

转换日志

每次转换会生成两个文件:

  1. SQL文件: output/filename_dm.sql - 转换后的SQL脚本
  2. 日志文件: output/filename_dm_conversion.log.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 可以自定义转换规则:

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

技术支持

遇到问题请检查转换日志文件,日志中包含详细的转换步骤和警告信息。