美文网首页
MySQL转换成ClickHouse的建表语句

MySQL转换成ClickHouse的建表语句

作者: 燃灯道童 | 来源:发表于2021-01-10 17:57 被阅读0次

需求:项目中有个功能需要同时实现mysql和clickhouse(本文后面简称ck),代码功能已完成想在ck上进行测试(因为部分语法有区别)。
问题:发现ck数据库上没有表。

要做的内容:测试用到的表从mysql整到ck上。

实现的步骤:
1.写了一个demo把mysql的建表语句转换成ck的建表语句。
2.使用DBeaver把数据从mysql传输到ck中。

第一步建表语句的demo代码如下。
用Java实现的,其实只是做了相关字段的替换。好在可以共用。
注:转换为ck的建表语句的引擎为ENGINE = Memory,根据需要酌情进行修改。

/**
 * @author yishuiping
 * @date 2020/12/25 9:28
 */
public class MysqlToClickHouse {
    public static String changeMysqlTableToClickHouse(String tableName) {
        String tables = tableName;
        String[] rows = tables.split("\n");
        String replaceTables = "";
        int i = 0;
        for (String row : rows) {
            if (row.contains("KEY")) {
                continue;
            }
            if (row.contains(") ENGINE=InnoDB")) {
                row = ") ENGINE = Memory";
            }
            String changeRow = row.replaceAll(" NOT NULL", "")
                    .replaceAll("AUTO_INCREMENT", "")
                    .replaceAll("CHARACTER SET utf8mb4", "")
                    .replaceAll("CHARACTER SET utf8", "")
                    .replaceAll("ON UPDATE CURRENT_TIMESTAMP", "")
                    .replaceAll("CURRENT_TIMESTAMP", "")
                    .replaceAll("datetime DEFAULT NULL", " DateTime ")
                    .replaceAll(" datetime ", " DateTime ");

            changeRow = changeRow.replaceAll("varchar\\(\\d+\\) DEFAULT NULL", "Nullable(String)");
            changeRow = changeRow.replaceAll("varchar\\(\\d+\\)", "String");
            changeRow = changeRow.replaceAll("text", "String");

            String[] changeColumns = changeRow.split("[ ]");
            //      System.out.println(changeRow);
            if (changeColumns[3].contains("int") || changeColumns[3].contains("bigint")) {
                int length = Integer.parseInt(changeColumns[3]
                        .replaceAll("bigint", "")
                        .replaceAll("tinyint", "")
                        .replaceAll("int", "")
                        .replaceAll("\\(", "")
                        .replaceAll("\\)", ""));
                String type = changeColumns[3].contains("bigint") ? "bigint" : "int";
                if (length < 3) {
                    changeRow = changeRow
                            .replaceFirst(type + "\\(" + length + "\\)", "Int8");
                } else if (length < 5) {
                    changeRow = changeRow
                            .replaceFirst(type + "\\(" + length + "\\)", "Int16");
                } else if (length <= 9) {
                    changeRow = changeRow
                            .replaceFirst(type + "\\(" + length + "\\)", "Int32");
                } else {
                    changeRow = changeRow
                            .replaceFirst(type + "\\(" + length + "\\)", "Int64");
                }
            }
            replaceTables += changeRow;
            i++;
        }
        if (replaceTables.contains(",) ENGINE = Memory")) {
            String temp = replaceTables.substring(0, replaceTables.indexOf(",) ENGINE = Memory"));
            replaceTables = temp + ") ENGINE = Memory ";
        }
        replaceTables.replaceAll("CREATE TABLE `" + tableName + "`", tableName + "_local");


        return replaceTables;
    }

    public static void main(String[] args) {
        //这里是用脚本跑出来后粘上去的。show create table XXX表名;
        //用mybatis连接数据库查询出来建表语句比较好
        String createTable = "CREATE TABLE `XXX表名` (\n" +
                "  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键(自动递增)',\n" +
                "  `user_id` bigint(20) NOT NULL COMMENT '用户id',\n" +
                "  `user_name` varchar(255) DEFAULT NULL COMMENT '用户名、账号',\n" +
                "  `table_id` varchar(255) DEFAULT NULL COMMENT '当前的表名',\n" +
                "  `filed` varchar(500) DEFAULT NULL COMMENT '存放有权限的字段',\n" +
                "  `database_id` varchar(100) DEFAULT NULL COMMENT '主题数据库',\n" +
                "  `is_del` varchar(1) DEFAULT NULL COMMENT '删除状态  ',\n" +
                "  `created_date` datetime DEFAULT NULL COMMENT '创建时间',\n" +
                "  `created_by` varchar(255) DEFAULT NULL COMMENT '创建人id',\n" +
                "  `created_name` varchar(255) DEFAULT NULL COMMENT '创建人姓名',\n" +
                "  `updated_date` datetime DEFAULT NULL COMMENT '更新时间',\n" +
                "  `updated_by` varchar(255) DEFAULT NULL COMMENT '更新人id',\n" +
                "  `updated_name` varchar(255) DEFAULT NULL COMMENT '更新人name',\n" +
                "  `flag` varchar(1) DEFAULT NULL COMMENT '0:待审核  1:通过  2:未通过',\n" +
                "  `apply_reason` varchar(255) COMMENT '申请原因',\n" +
                "  `ch_name` varchar(50) DEFAULT NULL COMMENT '表中文名',\n" +
                "  `descri_table` varchar(50) DEFAULT NULL COMMENT '表描述',\n" +
                "  `owner` varchar(50) DEFAULT NULL COMMENT '表的所有者',\n" +
                "  `audit_advice` varchar(255) DEFAULT NULL COMMENT '审批意见',\n" +
                "  `db_comment` varchar(100) DEFAULT NULL COMMENT '业务名称(数据库描述)',\n" +
                "  `db_class` varchar(100) DEFAULT NULL COMMENT '业务分类',\n" +
                "  `table_record_id` varchar(50) DEFAULT NULL COMMENT '表的记录Id',\n" +
                "  PRIMARY KEY (`id`)\n" +
                ") ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COMMENT='数据权限申请记录表'";
        String res = changeMysqlTableToClickHouse(createTable);
        System.out.println("转换后的建表语句为:" + res);
    }
}

生成的建表语句就可以在ck中进行执行了。

同步数据用的是DBeaver。


同步表数据的操作.png

相关文章

网友评论

      本文标题:MySQL转换成ClickHouse的建表语句

      本文链接:https://www.haomeiwen.com/subject/hvqlaktx.html