This commit is contained in:
2024-03-21 18:39:49 +08:00
parent 59585e6369
commit 8cc55c2c4b
3 changed files with 308 additions and 0 deletions

View File

@@ -100,4 +100,113 @@ public class _DbService extends BaseService {
return jBean;
}
// 比对表结构
/*@RestMapping(name = "table_compare", comment = "对比表结构")
public Kv tableCompare(String dbPlatA, String dbPlatB, String catalog) {
String sql = String.format("SELECT table_name 'tableName', column_name 'columnName', column_comment 'columnComment',column_type 'columnType',column_default 'columnDefault', is_nullable 'isNullable'" +
" FROM INFORMATION_SCHEMA.COLUMNS" +
" WHERE table_schema = '%s'", catalog);
List<Column> listA = MetaKit.getDbKit(dbPlatA, catalog).queryList(sql, Column.class);
List<Column> listB = MetaKit.getDbKit(dbPlatB, catalog).queryList(sql, Column.class);
Map<String, List<Column>> ddlA = Utils.group(listA, Column::getTableName);
Map<String, List<Column>> ddlB = Utils.group(listB, Column::getTableName);
Set<String> same = new HashSet<>(); // table_name;
List<Kv<String, Object>> differ = new ArrayList<>(); // 不相同的表,以及对应 A、B库的字段信息如[{"tableName": "", A: [{}], B: [{}], dif: [{}] }]
Kv<String, List<Table>> without = Kv.of(); // A,B不在对方库的表{A: [{}], B: [{}]}
ddlA.forEach((tableName, columns) -> {
// A 有B 无
if (!ddlB.containsKey(tableName)) {
List<Table> tables = without.getOrDefault("A", new ArrayList<>());
tables.add(new Table(tableName, columns));
without.set("A", tables);
}
// TODO 相同 、差异比较
List<Column> columns2 = ddlB.get(tableName);
if (columns2 == null) {
return;
}
List<Kv<String, Object>> dif = new ArrayList<>();
for (Column column : columns) {
Column column2 = columns2.stream().filter(c -> c.getColumnName().equals(column.getColumnName())).findFirst().orElse(null);
if (column2 == null) {
dif.add(Kv.of("column", column.getColumnName()).set("diff", "column not exist in B"));
} else {
if (!column.getColumnName().equals(column2.getColumnName())) {
dif.add(Kv.of("column", column.getColumnName()).set( "diff", "column name not same"));
}
if (!column.getColumnComment().equals(column2.getColumnComment())) {
dif.add(Kv.of("column", column.getColumnName()).set( "diff", "column comment not same"));
}
if (!column.getColumnType().equals(column2.getColumnType())) {
dif.add(Kv.of("column", column.getColumnName()).set( "diff", "column type not same"));
}
if (!column.getColumnDefault().equals(column2.getColumnDefault())) {
dif.add(Kv.of("column", column.getColumnName()).set( "diff", "column default not same"));
}
if (!column.getIsNullable().equals(column2.getIsNullable())) {
dif.add(Kv.of("column", column.getColumnName()).set( "diff", "column nullable not same"));
}
}
}
// columns2 中有 columns 中没有
for (Column column2 : columns2) {
if (!columns.stream().anyMatch(c -> c.getColumnName().equals(column2.getColumnName()))) {
dif.add(Kv.of("column", column2.getColumnName()).set( "diff", "column not exist in A"));
}
}
if (dif.size() > 0) {
differ.add(Kv.of("tableName", tableName).set( "A", columns).set( "B", columns2).set( "dif", dif));
}
});
// B 有A 无
ddlB.forEach((tableName, columns) -> {
if (ddlA.containsKey(tableName)) {
return;
}
List<Table> tables = without.getOrDefault("B", new ArrayList<>());
tables.add(new Table(tableName, columns));
without.set("B", tables);
});
Kv retKv = Kv.of(); // 返回结果
retKv.set("same", same);
retKv.set("differ", differ);
retKv.set("without", without);
return retKv;
}
@Getter
@Setter
static class Table {
String tableName;
List<Column> columns;
public Table(String tableName, List<Column> columns) {
this.tableName = tableName;
this.columns = columns;
}
}
@Getter
@Setter
static class Column {
@ConvertColumn(ignore = true)
private String tableName;
private String columnName;
private String columnComment;
private String columnType;
private String columnDefault;
private String isNullable;
}*/
}