MySQL的SQL语句转PostgreSQL的SQL语句工具编写总结

1、起因
   在学习基于vue+springboot的前后端分离项目时,因项目需求变更,需要将mysql数据库全部迁移到postgersql数据库的需求,因而编写了一个基于jave的sql语句转换工具
2、代码实现描述
   基于jsqlparser工具,完成数据库sql语句的读取,解析,并通过字符串替换完成postgresql语句的拼接,目前支持drop语句,create语句和insert语句的转化
3、源码链接:mysql2postgre: 支持将mysql的sql语句转换为postgersql的sql语句
4、核心代码块 
public class Mysql2Postgresql {
  /**
     *
     * @param sqlFilePath:表示mysql的sql脚本路径
     * @param postgresqlModel:表示postgersql中的模式
     */

    public void generatePostgreSql(String sqlFilePath, String postgresqlModel) throws IOException, JSQLParserException {
        List<Statement> dropStatement = new ArrayList<>();
        List<Statement> createStatement = new ArrayList<>();
        List<Statement> insertStatement = new ArrayList<>();
        // MySQL DDL路径
        String dDLs = FileUtils.readFileToString(new File(sqlFilePath), "UTF-8");
        Statements statements = CCJSqlParserUtil.parseStatements(dDLs);

        for (Statement s: statements.getStatements()) {
            if (s instanceof Drop) {
                dropStatement.add(s);
            } else if (s instanceof CreateTable) {
                createStatement.add(s);
            } else if (s instanceof Insert) {
                insertStatement.add(s);
            }
        }
        System.out.println("======Drop Table BEGIN=====");
        dropStatement
                .stream()
                .map(statement -> (Drop) statement)
                .forEach(ct -> {
                    System.out.println(ct.toString().replaceAll("`", "") + ";");
                });
        System.out.println("======Drop Table END=====\n");
        System.out.println("======Insert Data BEGIN=====");
        insertStatement
                .stream()
                .map(statement -> (Insert) statement)
                .forEach(ct -> {
                    System.out.println(ct.toString()
                            .replaceAll(ct.getTable().getName(), postgresqlModel +"." + ct.getTable().getName())
                            .replaceAll("`", "") + ";");
                });
        System.out.println("======Insert Data END=====\n");
        System.out.println("======Create Table BEGIN=====");
        createStatement
                .stream()
                .map(statement -> (CreateTable) statement).forEach(ct -> {
            Table table = ct.getTable();
            List<ColumnDefinition> columnDefinitions = ct.getColumnDefinitions();
            List<String> comments = new ArrayList<>();
            List<ColumnDefinition> collect = columnDefinitions.stream()
                    .peek(columnDefinition -> {
                        List<String> columnSpecStrings = columnDefinition.getColumnSpecs();
                        int commentIndex = getCommentIndex(columnSpecStrings);
                        if (commentIndex != -1) {
                            int commentStringIndex = commentIndex + 1;
                            String commentString = columnSpecStrings.get(commentStringIndex);

                            String commentSql = genCommentSql(table.toString(), columnDefinition.getColumnName(), commentString);
                            comments.add(commentSql);
                            columnSpecStrings.remove(commentStringIndex);
                            columnSpecStrings.remove(commentIndex);
                        }
                        columnDefinition.setColumnSpecs(columnSpecStrings);
                    }).collect(Collectors.toList());
            ct.setColumnDefinitions(collect);
            String createSQL = ct.toString()
                    .replaceAll("bigint \\([0-9]+\\)", "bigint")
//                    .replaceAll("varchar \\(255\\)", "varchar\\(255\\)")
                    .replaceAll("AUTO_INCREMENT", "")
                    .replaceAll("USING BTREE", "")
                    .replaceAll("`", "")
                    .replaceAll(" ENGINE = InnoDB = 191 DEFAULT CHARSET = utf8 ROW_FORMAT = COMPACT ", "")
                    .replaceAll("BIGINT UNIQUE NOT NULL AUTO_INCREMENT", "BIGSERIAL PRIMARY KEY")
                    .replaceAll("BIGINT NULL AUTO_INCREMENT", "BIGSERIAL PRIMARY KEY")
                    .replaceAll("BIGINT NOT NULL AUTO_INCREMENT", "BIGSERIAL PRIMARY KEY")
                    .replaceAll("INT NOT NULL AUTO_INCREMENT", "BIGSERIAL PRIMARY KEY")
                    .replaceAll("INT NULL AUTO_INCREMENT", "BIGSERIAL PRIMARY KEY")
                    .replaceAll("IF NOT EXISTS", "")
                    .replaceAll("TINYINT", "SMALLINT")
                    .replaceAll("DATETIME", "TIMESTAMP")
                    .replaceAll(", PRIMARY KEY \\(\"id\"\\)", "")
                    .replaceAll("DEFAULT NULL", "NULL")
                    .replaceAll(", KEY [a-z_A-Z0-9]+ \\(.*\\)", ")")
                    .replaceAll(" ENGINE .* COMPACT ", "")
                    .replaceAll("datetime", "timestamp")
                    .replaceAll("int \\([0-9]+\\)", "int")
                    .replaceAll(", UNIQUE KEY [a-z_A-Z0-9]+ \\(.*\\) ", "")
                    .replaceAll("ENGINE .* = utf8", "")
                    .replaceAll(" user ", " \"user\" ");

            // 如果存在表注释
            if (createSQL.contains("COMMENT")) {
                createSQL = createSQL.substring(0, createSQL.indexOf("COMMENT"));
            }
            System.out.println(createSQL + ";");

            comments.forEach(t -> System.out.println(t.replaceAll("`", "") + ";"));
        });
        System.out.println("======Create Table END=====\n");
    }

}

5、注意点:该脚本不支持识别事务的相关语句,如commit,如有文档包含相关字段,需要提前删除后才能正常转化 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQLPostgreSQL是两种常用的关系型数据库管理系统(RDBMS)。它们使用的是不同的SQL语法和功能。因此,将MySQLSQL语句换为PostgreSQL的语法是一项常见的任务。 为了实现这种换,可以使用一些工具和技术。以下是一些常用的工具和方法: 1. 使用在线工具:有一些在线工具可用于将MySQL语句换为PostgreSQL语法。你只需将MySQL语句粘贴到工具中,然后选择将其换为PostgreSQL语法。这些工具会自动将语句换为相应的PostgreSQL语法。一些流行的在线工具包括SQLines SQL换器和fromsqltocode工具。 2. 使用第三方软件:有一些第三方软件可用于将MySQL数据库迁移到PostgreSQL,并自动换语句。例如,SQLMaestro的MySQLPostgreSQL工具可以帮助你轻松将MySQL语句换为PostgreSQL语法,并将数据库迁移到PostgreSQL。 3. 手工换:如果对SQL语法和MySQLPostgreSQL的功能有深入的了解,也可以手动将MySQL语句换为PostgreSQL语法。这需要查看和理解两个数据库的语法规则,然后逐个换每个语句。手动换可能需要花费一些时间和精力,但对于复杂的查询可能是最灵活和可靠的方法。 MySQL语法为PostgreSQL语法需要注意以下几个主要差异: - 数据类型:MySQLPostgreSQL使用不同的数据类型,因此在换过程中需要注意这一点,并将MySQL的数据类型换为PostgreSQL的等效类型。 - 语法:MySQLPostgreSQL在某些语法方面也有所不同,例如连接语法、子查询语法等。所以需要了解并适当地换这些差异。 总之,将MySQL语法换为PostgreSQL语法的工具和方法有很多选择。无论选择哪种方法,都需要对SQL语法和MySQLPostgreSQL的特定功能有深入的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值