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 {
private ColumnType javaType;
private String columnFamily;
private Integer position;
private Integer length;
private Integer precision;
private Integer scale;
private String characterSet;
......
......@@ -314,14 +314,29 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
}
field.setName(columnName);
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("\"|'", "");
field.setComment(columnComment);
}
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())) {
field.setCharacterSet(results.getString(dbQuery.characterSet()));
......@@ -339,7 +354,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
field.setScale(results.getInt(dbQuery.scale()));
}
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));
columns.add(field);
......@@ -564,7 +580,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
while (results.next()) {
LinkedHashMap<String, Object> data = new LinkedHashMap<>();
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);
count++;
......@@ -597,9 +614,11 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
JdbcSelectResult result = JdbcSelectResult.buildResult();
for (SQLStatement item : stmtList) {
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);
} 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 {
resList.add(executeUpdate(item.toString()));
result.setStatusList(resList);
......@@ -653,7 +672,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
PreparedStatement preparedStatement = null;
ResultSet results = null;
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 =
"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;
try {
......@@ -694,11 +714,16 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
// 匹配对应的表
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()
// 去重
.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<>(
Comparator.comparing(x -> getReValue(x.get(dbQuery.schemaName()), splitConfig) + "."
+ getReValue(x.get(dbQuery.tableName()), splitConfig)))),
ArrayList::new))
.stream().map(x -> {
Table tableInfo = new Table();
tableInfo.setName(getReValue(x.get(dbQuery.tableName()), splitConfig));
......@@ -710,7 +735,8 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
tableInfo.setOptions(x.get(dbQuery.options()));
tableInfo.setRows(Long.valueOf(x.get(dbQuery.rows())));
try {
tableInfo.setCreateTime(SimpleDateFormat.getDateInstance().parse(x.get(dbQuery.createTime())));
tableInfo.setCreateTime(
SimpleDateFormat.getDateInstance().parse(x.get(dbQuery.createTime())));
String updateTime = x.get(dbQuery.updateTime());
if (Asserts.isNotNullString(updateTime)) {
tableInfo.setUpdateTime(SimpleDateFormat.getDateInstance().parse(updateTime));
......@@ -719,17 +745,24 @@ public abstract class AbstractJdbcDriver extends AbstractDriver {
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),
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);
String currentSchemaName = getReValue(x.get(dbQuery.schemaName()), splitConfig) + "."
+ getReValue(x.get(dbQuery.tableName()), splitConfig);
List<String> schemaTableNameList =
mapList.stream().filter(y -> (getReValue(y.get(dbQuery.schemaName()), splitConfig) + "." + getReValue(y.get(dbQuery.tableName()), splitConfig)).equals(currentSchemaName))
.map(y -> y.get(dbQuery.schemaName()) + "." + y.get(dbQuery.tableName())).collect(Collectors.toList());
mapList.stream()
.filter(y -> (getReValue(y.get(dbQuery.schemaName()), splitConfig) + "."
+ getReValue(y.get(dbQuery.tableName()), splitConfig))
.equals(currentSchemaName))
.map(y -> y.get(dbQuery.schemaName()) + "." + y.get(dbQuery.tableName()))
.collect(Collectors.toList());
tableInfo.setSchemaTableNameList(schemaTableNameList);
} else {
tableInfo.setSchemaTableNameList(Collections.singletonList(x.get(dbQuery.schemaName()) + "." + x.get(dbQuery.tableName())));
tableInfo.setSchemaTableNameList(Collections
.singletonList(x.get(dbQuery.schemaName()) + "." + x.get(dbQuery.tableName())));
}
return tableInfo;
}).collect(Collectors.toList());
......
......@@ -83,17 +83,15 @@ public class MySqlDriver extends AbstractJdbcDriver {
Column column = table.getColumns().get(i);
sb.append(" `")
.append(column.getName()).append("` ")
.append(column.getType()).append(" ");
//todo tmp process for varchar
if (column.getType().equals("varchar")) {
sb.append("(255)");
}
if (column.getPrecision() > 0) {
sb.append("(").append(column.getPrecision());
if (column.getScale() > 0) {
sb.append(",").append(column.getScale());
}
sb.append(")");
.append(column.getType());
// 处理浮点类型
if (column.getPrecision() > 0 && column.getScale() > 0) {
sb.append("(")
.append(column.getLength())
.append(",").append(column.getScale())
.append(")");
} else if (null != column.getLength()) { // 处理字符串类型和数值型
sb.append("(").append(column.getLength()).append(")");
}
if (Asserts.isNotNull(column.getCharacterSet())) {
sb.append(" CHARACTER SET ").append(column.getCharacterSet());
......
......@@ -42,7 +42,7 @@ public class MySqlQuery extends AbstractDBQuery {
@Override
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"
+ ",COLLATION_NAME,ORDINAL_POSITION from INFORMATION_SCHEMA.COLUMNS "
+ "where TABLE_SCHEMA = '" + schemaName + "' and TABLE_NAME = '" + tableName + "' "
......@@ -54,4 +54,8 @@ public class MySqlQuery extends AbstractDBQuery {
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