Unverified Commit 70c4d1f1 authored by zzzzzzzs's avatar zzzzzzzs Committed by GitHub

[Feature][Auto Create Mysql table] MySQL automatically creates tables...

[Feature][Auto Create Mysql table] MySQL automatically creates tables consistent with the original tables (#1179)

* MySQL automatically creates tables consistent with the original tables

* Optimization type length judgment logic

* format code

* format code import
parent 09a9d4aa
...@@ -46,6 +46,7 @@ public class Column implements Serializable { ...@@ -46,6 +46,7 @@ public class Column implements Serializable {
private ColumnType javaType; private ColumnType javaType;
private String columnFamily; private String columnFamily;
private Integer position; private Integer position;
private Integer length;
private Integer precision; private Integer precision;
private Integer scale; private Integer scale;
private String characterSet; private String characterSet;
......
...@@ -314,14 +314,29 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -314,14 +314,29 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
} }
field.setName(columnName); field.setName(columnName);
if (columnList.contains(dbQuery.columnType())) { if (columnList.contains(dbQuery.columnType())) {
field.setType(results.getString(dbQuery.columnType())); String columnType = results.getString(dbQuery.columnType());
if (columnType.contains("(")) {
String type = columnType.replaceAll("\\(.*\\)", "");
if (!columnType.contains(",")) {
Integer length = Integer.valueOf(columnType.replaceAll("\\D", ""));
field.setLength(length);
} else {
// 例如浮点类型的长度和精度是一样的,decimal(10,2)
field.setLength(results.getInt(dbQuery.precision()));
}
field.setType(type);
} else {
field.setType(columnType);
}
} }
if (columnList.contains(dbQuery.columnComment()) && Asserts.isNotNull(results.getString(dbQuery.columnComment()))) { if (columnList.contains(dbQuery.columnComment())
&& Asserts.isNotNull(results.getString(dbQuery.columnComment()))) {
String columnComment = results.getString(dbQuery.columnComment()).replaceAll("\"|'", ""); String columnComment = results.getString(dbQuery.columnComment()).replaceAll("\"|'", "");
field.setComment(columnComment); field.setComment(columnComment);
} }
if (columnList.contains(dbQuery.isNullable())) { if (columnList.contains(dbQuery.isNullable())) {
field.setNullable(Asserts.isEqualsIgnoreCase(results.getString(dbQuery.isNullable()), dbQuery.nullableValue())); field.setNullable(Asserts.isEqualsIgnoreCase(results.getString(dbQuery.isNullable()),
dbQuery.nullableValue()));
} }
if (columnList.contains(dbQuery.characterSet())) { if (columnList.contains(dbQuery.characterSet())) {
field.setCharacterSet(results.getString(dbQuery.characterSet())); field.setCharacterSet(results.getString(dbQuery.characterSet()));
...@@ -339,7 +354,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -339,7 +354,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
field.setScale(results.getInt(dbQuery.scale())); field.setScale(results.getInt(dbQuery.scale()));
} }
if (columnList.contains(dbQuery.autoIncrement())) { if (columnList.contains(dbQuery.autoIncrement())) {
field.setAutoIncrement(Asserts.isEqualsIgnoreCase(results.getString(dbQuery.autoIncrement()), "auto_increment")); field.setAutoIncrement(
Asserts.isEqualsIgnoreCase(results.getString(dbQuery.autoIncrement()), "auto_increment"));
} }
field.setJavaType(getTypeConvert().convert(field)); field.setJavaType(getTypeConvert().convert(field));
columns.add(field); columns.add(field);
...@@ -503,10 +519,10 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -503,10 +519,10 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
String limitEnd = queryData.getOption().getLimitEnd(); String limitEnd = queryData.getOption().getLimitEnd();
StringBuilder optionBuilder = new StringBuilder() StringBuilder optionBuilder = new StringBuilder()
.append("select * from ") .append("select * from ")
.append(queryData.getSchemaName()) .append(queryData.getSchemaName())
.append(".") .append(".")
.append(queryData.getTableName()); .append(queryData.getTableName());
if (where != null && !where.equals("")) { if (where != null && !where.equals("")) {
optionBuilder.append(" where ").append(where); optionBuilder.append(" where ").append(where);
...@@ -522,9 +538,9 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -522,9 +538,9 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
limitEnd = "100"; limitEnd = "100";
} }
optionBuilder.append(" limit ") optionBuilder.append(" limit ")
.append(limitStart) .append(limitStart)
.append(",") .append(",")
.append(limitEnd); .append(limitEnd);
return optionBuilder; return optionBuilder;
} }
...@@ -564,7 +580,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -564,7 +580,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
while (results.next()) { while (results.next()) {
LinkedHashMap<String, Object> data = new LinkedHashMap<>(); LinkedHashMap<String, Object> data = new LinkedHashMap<>();
for (int i = 0; i < columns.size(); i++) { for (int i = 0; i < columns.size(); i++) {
data.put(columns.get(i).getName(), getTypeConvert().convertValue(results, columns.get(i).getName(), columns.get(i).getType())); data.put(columns.get(i).getName(),
getTypeConvert().convertValue(results, columns.get(i).getName(), columns.get(i).getType()));
} }
datas.add(data); datas.add(data);
count++; count++;
...@@ -597,9 +614,11 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -597,9 +614,11 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
JdbcSelectResult result = JdbcSelectResult.buildResult(); JdbcSelectResult result = JdbcSelectResult.buildResult();
for (SQLStatement item : stmtList) { for (SQLStatement item : stmtList) {
String type = item.getClass().getSimpleName(); String type = item.getClass().getSimpleName();
if (type.toUpperCase().contains("SELECT") || type.toUpperCase().contains("SHOW") || type.toUpperCase().contains("DESC") || type.toUpperCase().contains("SQLEXPLAINSTATEMENT")) { if (type.toUpperCase().contains("SELECT") || type.toUpperCase().contains("SHOW")
|| type.toUpperCase().contains("DESC") || type.toUpperCase().contains("SQLEXPLAINSTATEMENT")) {
result = query(item.toString(), limit); result = query(item.toString(), limit);
} else if (type.toUpperCase().contains("INSERT") || type.toUpperCase().contains("UPDATE") || type.toUpperCase().contains("DELETE")) { } else if (type.toUpperCase().contains("INSERT") || type.toUpperCase().contains("UPDATE")
|| type.toUpperCase().contains("DELETE")) {
try { try {
resList.add(executeUpdate(item.toString())); resList.add(executeUpdate(item.toString()));
result.setStatusList(resList); result.setStatusList(resList);
...@@ -653,8 +672,9 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -653,8 +672,9 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
PreparedStatement preparedStatement = null; PreparedStatement preparedStatement = null;
ResultSet results = null; ResultSet results = null;
IDBQuery dbQuery = getDBQuery(); IDBQuery dbQuery = getDBQuery();
String sql = "select DATA_LENGTH,TABLE_NAME AS `NAME`,TABLE_SCHEMA AS `Database`,TABLE_COMMENT AS COMMENT,TABLE_CATALOG AS `CATALOG`,TABLE_TYPE" String sql =
+ " AS `TYPE`,ENGINE AS `ENGINE`,CREATE_OPTIONS AS `OPTIONS`,TABLE_ROWS AS `ROWS`,CREATE_TIME,UPDATE_TIME from information_schema.tables WHERE TABLE_TYPE='BASE TABLE'"; "select DATA_LENGTH,TABLE_NAME AS `NAME`,TABLE_SCHEMA AS `Database`,TABLE_COMMENT AS COMMENT,TABLE_CATALOG AS `CATALOG`,TABLE_TYPE"
+ " AS `TYPE`,ENGINE AS `ENGINE`,CREATE_OPTIONS AS `OPTIONS`,TABLE_ROWS AS `ROWS`,CREATE_TIME,UPDATE_TIME from information_schema.tables WHERE TABLE_TYPE='BASE TABLE'";
List<Map<String, String>> schemas = null; List<Map<String, String>> schemas = null;
try { try {
preparedStatement = conn.get().prepareStatement(sql); preparedStatement = conn.get().prepareStatement(sql);
...@@ -693,46 +713,59 @@ public abstract class AbstractJdbcDriver extends AbstractDriver { ...@@ -693,46 +713,59 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
String tableName = split[1]; String tableName = split[1];
// 匹配对应的表 // 匹配对应的表
List<Map<String, String>> mapList = schemaList.stream() List<Map<String, String>> mapList = schemaList.stream()
// 过滤不匹配的表 // 过滤不匹配的表
.filter(x -> contains(database, x.get(dbQuery.schemaName())) && contains(tableName, x.get(dbQuery.tableName()))).collect(Collectors.toList()); .filter(x -> contains(database, x.get(dbQuery.schemaName()))
&& contains(tableName, x.get(dbQuery.tableName())))
.collect(Collectors.toList());
List<Table> tableList = mapList.stream() List<Table> tableList = mapList.stream()
// 去重 // 去重
.collect(Collectors.collectingAndThen(Collectors.toCollection( .collect(Collectors.collectingAndThen(Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(x -> getReValue(x.get(dbQuery.schemaName()), splitConfig) + "." + getReValue(x.get(dbQuery.tableName()), splitConfig)))), ArrayList::new)) () -> new TreeSet<>(
.stream().map(x -> { Comparator.comparing(x -> getReValue(x.get(dbQuery.schemaName()), splitConfig) + "."
Table tableInfo = new Table(); + getReValue(x.get(dbQuery.tableName()), splitConfig)))),
tableInfo.setName(getReValue(x.get(dbQuery.tableName()), splitConfig)); ArrayList::new))
tableInfo.setComment(x.get(dbQuery.tableComment())); .stream().map(x -> {
tableInfo.setSchema(getReValue(x.get(dbQuery.schemaName()), splitConfig)); Table tableInfo = new Table();
tableInfo.setType(x.get(dbQuery.tableType())); tableInfo.setName(getReValue(x.get(dbQuery.tableName()), splitConfig));
tableInfo.setCatalog(x.get(dbQuery.catalogName())); tableInfo.setComment(x.get(dbQuery.tableComment()));
tableInfo.setEngine(x.get(dbQuery.engine())); tableInfo.setSchema(getReValue(x.get(dbQuery.schemaName()), splitConfig));
tableInfo.setOptions(x.get(dbQuery.options())); tableInfo.setType(x.get(dbQuery.tableType()));
tableInfo.setRows(Long.valueOf(x.get(dbQuery.rows()))); tableInfo.setCatalog(x.get(dbQuery.catalogName()));
try { tableInfo.setEngine(x.get(dbQuery.engine()));
tableInfo.setCreateTime(SimpleDateFormat.getDateInstance().parse(x.get(dbQuery.createTime()))); tableInfo.setOptions(x.get(dbQuery.options()));
String updateTime = x.get(dbQuery.updateTime()); tableInfo.setRows(Long.valueOf(x.get(dbQuery.rows())));
if (Asserts.isNotNullString(updateTime)) { try {
tableInfo.setUpdateTime(SimpleDateFormat.getDateInstance().parse(updateTime)); tableInfo.setCreateTime(
} SimpleDateFormat.getDateInstance().parse(x.get(dbQuery.createTime())));
} catch (ParseException ignored) { String updateTime = x.get(dbQuery.updateTime());
logger.warn("set date fail"); if (Asserts.isNotNullString(updateTime)) {
tableInfo.setUpdateTime(SimpleDateFormat.getDateInstance().parse(updateTime));
}
} catch (ParseException ignored) {
logger.warn("set date fail");
} }
TableType tableType = TableType.type(isSplit(x.get(dbQuery.schemaName()), splitConfig), isSplit(x.get(dbQuery.tableName()), splitConfig)); TableType tableType = TableType.type(isSplit(x.get(dbQuery.schemaName()), splitConfig),
tableInfo.setTableType(tableType); isSplit(x.get(dbQuery.tableName()), splitConfig));
tableInfo.setTableType(tableType);
if (tableType != TableType.SINGLE_DATABASE_AND_TABLE) {
String currentSchemaName = getReValue(x.get(dbQuery.schemaName()), splitConfig) + "." + getReValue(x.get(dbQuery.tableName()), splitConfig); if (tableType != TableType.SINGLE_DATABASE_AND_TABLE) {
List<String> schemaTableNameList = String currentSchemaName = getReValue(x.get(dbQuery.schemaName()), splitConfig) + "."
mapList.stream().filter(y -> (getReValue(y.get(dbQuery.schemaName()), splitConfig) + "." + getReValue(y.get(dbQuery.tableName()), splitConfig)).equals(currentSchemaName)) + getReValue(x.get(dbQuery.tableName()), splitConfig);
.map(y -> y.get(dbQuery.schemaName()) + "." + y.get(dbQuery.tableName())).collect(Collectors.toList()); List<String> schemaTableNameList =
tableInfo.setSchemaTableNameList(schemaTableNameList); mapList.stream()
} else { .filter(y -> (getReValue(y.get(dbQuery.schemaName()), splitConfig) + "."
tableInfo.setSchemaTableNameList(Collections.singletonList(x.get(dbQuery.schemaName()) + "." + x.get(dbQuery.tableName()))); + getReValue(y.get(dbQuery.tableName()), splitConfig))
} .equals(currentSchemaName))
return tableInfo; .map(y -> y.get(dbQuery.schemaName()) + "." + y.get(dbQuery.tableName()))
}).collect(Collectors.toList()); .collect(Collectors.toList());
tableInfo.setSchemaTableNameList(schemaTableNameList);
} else {
tableInfo.setSchemaTableNameList(Collections
.singletonList(x.get(dbQuery.schemaName()) + "." + x.get(dbQuery.tableName())));
}
return tableInfo;
}).collect(Collectors.toList());
set.addAll(tableList); set.addAll(tableList);
} }
......
...@@ -82,18 +82,16 @@ public class MySqlDriver extends AbstractJdbcDriver { ...@@ -82,18 +82,16 @@ public class MySqlDriver extends AbstractJdbcDriver {
for (int i = 0; i < table.getColumns().size(); i++) { for (int i = 0; i < table.getColumns().size(); i++) {
Column column = table.getColumns().get(i); Column column = table.getColumns().get(i);
sb.append(" `") sb.append(" `")
.append(column.getName()).append("` ") .append(column.getName()).append("` ")
.append(column.getType()).append(" "); .append(column.getType());
//todo tmp process for varchar // 处理浮点类型
if (column.getType().equals("varchar")) { if (column.getPrecision() > 0 && column.getScale() > 0) {
sb.append("(255)"); sb.append("(")
} .append(column.getLength())
if (column.getPrecision() > 0) { .append(",").append(column.getScale())
sb.append("(").append(column.getPrecision()); .append(")");
if (column.getScale() > 0) { } else if (null != column.getLength()) { // 处理字符串类型和数值型
sb.append(",").append(column.getScale()); sb.append("(").append(column.getLength()).append(")");
}
sb.append(")");
} }
if (Asserts.isNotNull(column.getCharacterSet())) { if (Asserts.isNotNull(column.getCharacterSet())) {
sb.append(" CHARACTER SET ").append(column.getCharacterSet()); sb.append(" CHARACTER SET ").append(column.getCharacterSet());
......
...@@ -42,7 +42,7 @@ public class MySqlQuery extends AbstractDBQuery { ...@@ -42,7 +42,7 @@ public class MySqlQuery extends AbstractDBQuery {
@Override @Override
public String columnsSql(String schemaName, String tableName) { public String columnsSql(String schemaName, String tableName) {
return "select COLUMN_NAME,DATA_TYPE,COLUMN_COMMENT,COLUMN_KEY,EXTRA AS AUTO_INCREMENT" return "select COLUMN_NAME,COLUMN_TYPE,COLUMN_COMMENT,COLUMN_KEY,EXTRA AS AUTO_INCREMENT"
+ ",COLUMN_DEFAULT,IS_NULLABLE,NUMERIC_PRECISION,NUMERIC_SCALE,CHARACTER_SET_NAME" + ",COLUMN_DEFAULT,IS_NULLABLE,NUMERIC_PRECISION,NUMERIC_SCALE,CHARACTER_SET_NAME"
+ ",COLLATION_NAME,ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS " + ",COLLATION_NAME,ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS "
+ "where TABLE_SCHEMA = '" + schemaName + "' and TABLE_NAME = '" + tableName + "' " + "where TABLE_SCHEMA = '" + schemaName + "' and TABLE_NAME = '" + tableName + "' "
...@@ -54,4 +54,8 @@ public class MySqlQuery extends AbstractDBQuery { ...@@ -54,4 +54,8 @@ public class MySqlQuery extends AbstractDBQuery {
return "Database"; return "Database";
} }
@Override
public String columnType() {
return "COLUMN_TYPE";
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment