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