# sql-converter **Repository Path**: CRESCENT007/sql-converter ## Basic Information - **Project Name**: sql-converter - **Description**: 数据库表转换器,适配cool admin - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-25 - **Last Updated**: 2025-11-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MySQL到PostgreSQL表结构转换器 一个独立的工具,用于将MySQL表结构转换为PostgreSQL表结构,并自动补充项目要求的实体基础字段。 ## 功能特性 - ✅ 解析MySQL CREATE TABLE语句 - ✅ 自动补充项目要求的实体基础字段(id, createTime, updateTime, tenantId) - ✅ MySQL到PostgreSQL数据类型自动转换 - ✅ 索引和约束转换 - ✅ 支持从SQL文件转换 - ✅ 支持从MySQL数据库直接读取表结构 - ✅ 生成PostgreSQL兼容的SQL文件 - ✅ **新增**:支持转换INSERT语句,自动为新增字段填充随机值(使用 `--insert` 选项) - ✅ **新增**:支持为所有表名添加前缀(使用 `--add ` 选项),自动应用于CREATE TABLE、索引、INSERT、注释等所有语句 - ✅ **新增**:自动生成 `drop.sql` 文件,包含所有转换后表的 DROP TABLE 语句 ## 项目要求的实体基础字段 所有表都会自动添加以下基础字段(如果不存在): - `id` - BIGSERIAL PRIMARY KEY(自增主键) - `createTime` - VARCHAR(创建时间,带索引) - `updateTime` - VARCHAR(更新时间,带索引) - `tenantId` - INTEGER(租户ID,可为空,带索引) ## 安装 ```bash cd table-converter npm install npm run build ``` ## 快速开始 ### 1. 准备MySQL SQL文件 创建一个包含CREATE TABLE语句的SQL文件,例如 `input.sql`: ```sql CREATE TABLE `user` ( `name` VARCHAR(50) NOT NULL COMMENT '用户名', `email` VARCHAR(100) NOT NULL COMMENT '邮箱', `status` TINYINT DEFAULT 1 COMMENT '状态', PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ### 2. 运行转换 ```bash # 从SQL文件转换 npm start convert -i input.sql -o output.sql # 或从数据库直接读取 npm start from-db -h localhost -P 3306 -u root -p password -d mydb -o output.sql ``` ### 3. 查看结果 转换后的PostgreSQL SQL文件将包含: - 所有原始列(已转换类型) - 自动添加的基础字段(id, createTime, updateTime, tenantId) - 索引定义 - 列注释 同时会自动生成 `drop.sql` 文件,包含所有转换后表的 DROP TABLE 语句,方便清理。 ## 使用方法 ### 方式一:从SQL文件转换 ```bash # 基本用法(只转换表结构) npm run convert -i input.sql -o output.sql # 或者直接运行 node dist/index.js convert -i input.sql -o output.sql # 同时转换INSERT语句(为新增字段填充随机值) npm run convert -i input.sql -o output.sql --insert # 或者直接运行(推荐) node dist/index.js convert -i input.sql -o output.sql --insert # 为所有表名添加前缀(同时应用于CREATE TABLE、索引、INSERT等语句) node dist/index.js convert -i input.sql -o output.sql --add prefix_ # 同时使用多个选项 node dist/index.js convert -i input.sql -o output.sql --insert --add prefix_ # 注意:npm start 不会传递额外参数,请使用 npm run convert 或直接运行 node dist/index.js ``` ### 方式二:从MySQL数据库直接读取 ```bash # 转换所有表 npm start from-db \ -h localhost \ -P 3306 \ -u root \ -p password \ -d database_name \ -o output.sql # 转换指定表 npm start from-db \ -h localhost \ -P 3306 \ -u root \ -p password \ -d database_name \ -o output.sql \ -t table1,table2,table3 ``` ## 数据类型映射 | MySQL类型 | PostgreSQL类型 | |-----------|----------------| | TINYINT | SMALLINT | | INT | INTEGER | | BIGINT | BIGINT | | FLOAT | REAL | | DOUBLE | DOUBLE PRECISION | | DECIMAL | NUMERIC | | VARCHAR | VARCHAR | | TEXT | TEXT | | DATETIME | TIMESTAMP | | TIMESTAMP | TIMESTAMP | | JSON | JSONB | | AUTO_INCREMENT | SERIAL/BIGSERIAL | ## 示例 ### 输入(MySQL) ```sql CREATE TABLE `user` ( `name` VARCHAR(50) NOT NULL COMMENT '用户名', `email` VARCHAR(100) NOT NULL COMMENT '邮箱', `status` TINYINT DEFAULT 1 COMMENT '状态', PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ### 输出(PostgreSQL) ```sql CREATE TABLE IF NOT EXISTS "user" ( "name" VARCHAR(50) NOT NULL, "email" VARCHAR(100) NOT NULL, "status" SMALLINT DEFAULT 1, "id" BIGSERIAL PRIMARY KEY, "createTime" VARCHAR NOT NULL, "updateTime" VARCHAR NOT NULL, "tenantId" INTEGER ); CREATE INDEX IF NOT EXISTS "idx_user_createTime" ON "user" ("createTime"); CREATE INDEX IF NOT EXISTS "idx_user_updateTime" ON "user" ("updateTime"); CREATE INDEX IF NOT EXISTS "idx_user_tenantId" ON "user" ("tenantId"); COMMENT ON COLUMN "user"."name" IS '用户名'; COMMENT ON COLUMN "user"."email" IS '邮箱'; COMMENT ON COLUMN "user"."status" IS '状态'; COMMENT ON COLUMN "user"."id" IS 'ID'; COMMENT ON COLUMN "user"."createTime" IS '创建时间'; COMMENT ON COLUMN "user"."updateTime" IS '更新时间'; COMMENT ON COLUMN "user"."tenantId" IS '租户ID'; ``` ## INSERT语句转换功能 使用 `--insert` 选项可以同时转换INSERT语句。转换器会: 1. **自动识别新增字段**:检测哪些字段是新增的基础字段(id, createTime, updateTime, tenantId) 2. **为新增字段填充随机值**: - `id`: 使用 `DEFAULT`(PostgreSQL会自动生成) - `createTime`: 随机生成时间字符串(格式:YYYY-MM-DD HH:mm:ss) - `updateTime`: 随机生成时间字符串(格式:YYYY-MM-DD HH:mm:ss) - `tenantId`: 随机生成整数(1-100)或 NULL(70%概率为整数,30%概率为NULL) 3. **保留原始数据**:原始INSERT语句中的字段值会被保留 4. **调整列顺序**:INSERT语句的列顺序会调整为与转换后的表结构一致(基础字段在前) ### 示例 **输入(MySQL)**: ```sql CREATE TABLE `user` ( `name` VARCHAR(50) NOT NULL, `email` VARCHAR(100) NOT NULL ); INSERT INTO `user` (`name`, `email`) VALUES ('张三', 'zhangsan@example.com'); ``` **输出(PostgreSQL,使用 --insert)**: ```sql CREATE TABLE IF NOT EXISTS "user" ( "id" BIGSERIAL PRIMARY KEY, "createTime" VARCHAR(19) NOT NULL, "updateTime" VARCHAR(19) NOT NULL, "tenantId" INTEGER, "name" VARCHAR(50) NOT NULL, "email" VARCHAR(100) NOT NULL ); INSERT INTO "user" ("id", "createTime", "updateTime", "tenantId", "name", "email") VALUES (DEFAULT, '2024-03-15 14:23:45', '2024-03-15 14:23:45', 42, '张三', 'zhangsan@example.com'); ``` ## 注意事项 1. 如果原表已有`id`字段但不是主键,会被替换为标准的主键`id`字段 2. 如果原表已有`createTime`、`updateTime`或`tenantId`字段,不会被重复添加 3. 所有表名和列名在PostgreSQL中都会使用双引号包裹 4. MySQL的`AUTO_INCREMENT`会自动转换为PostgreSQL的`SERIAL`或`BIGSERIAL` 5. MySQL的`CURRENT_TIMESTAMP`默认值会转换为PostgreSQL的`NOW()` 6. **INSERT转换**:使用 `--insert` 选项时,新增字段的值是随机生成的,可能需要根据实际情况调整 ## 开发 ```bash # 开发模式(使用ts-node) npm run dev convert -i input.sql -o output.sql # 编译 npm run build # 运行编译后的代码 npm start convert -i input.sql -o output.sql ``` ## 许可证 MIT