需求:项目中有个功能需要同时实现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。

网友评论