栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

项目版本升级过程中低版本数据库表升级成高版本数据库表的解决

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

项目版本升级过程中低版本数据库表升级成高版本数据库表的解决

  项目2个版本的代差较大,。要把客户生成环境升级成高版本。要把高版本累加的表结构同步到客户低版本生产环境。又不能影响客户生产环境的原有数据。

方案:
1> 用多数据源把2个版本的表和列定义读出来。
2>在代码里进行分析低版本缺失的表和字段,并生成脚本。

简单的多数据源+查表元数据+代码分析应用。实用有效。逻辑部很很简单,简单的包含与不包含判断是否需要添加删除。
// 读取表的元数据

public class TableMaterial {
	//低版本的表集合
    private List v4tableNames = new ArrayList<>();
	//低版本的表与列的关系映射
    private Map> v4TableColumns = new HashMap<>();
	//高版本表集合
    private List v41tableNames = new ArrayList<>();
	//高版本表映射
    private Map> v41TableColumns = new HashMap<>();
    }

//分析缺失的表

public class AddTableDropTableAnalyser implements VersionAnalyser {

    public void analyser(TableMaterial tableMaterial) {
        List v4tableNames = tableMaterial.getV4tableNames();
        List v41tableNames = tableMaterial.getV41tableNames();
		//低版本需要补建的表,这里只是在公司把要建的表弄到一个单独的库里,再从单独的库里导出详细的建表语句。所以用了like建表。
        StringBuffer addTableMessages = new StringBuffer();
        String createTableSql = "create table %s like xxx.%s;" + System.lineSeparator();
        for (String v41tableName : v41tableNames) {
            if (!v4tableNames.contains(v41tableName)) {
                addTableMessages.append(String.format(createTableSql, v41tableName, v41tableName));
            }
        }
        FileUtils.addContent("41版本比对40版本添加的表.sql", addTableMessages.toString());

		// 删除的表,这部份脚本没必要在低版本执行。
        StringBuffer delTableMessages = new StringBuffer();
        String dropTableSql = "drop table %s;" + System.lineSeparator();
        for (String v4tableName : v4tableNames) {
            if (!v41tableNames.contains(v4tableName)) {
                delTableMessages.append(String.format(dropTableSql, v4tableName));
            }
        }
        FileUtils.addContent("41版本比对40版本删除的表.sql", delTableMessages.toString());
    }
}

//分析缺失的字段

public class ColumnInfoAnalyser implements VersionAnalyser {

    private StringBuffer addColumns = null;
    private StringBuffer dropColumns = null;

    @Override
    public void analyser(TableMaterial tableMaterial) {
        addColumns = new StringBuffer();
        dropColumns = new StringBuffer();
		// 低版本表和字段
        Map> v4TableColumns = tableMaterial.getV4TableColumns();
		// 高版本表和字段
        Map> v41TableColumns = tableMaterial.getV41TableColumns();

        v41TableColumns.forEach((tableName, v41Columns) -> {
            if (v4TableColumns.containsKey(tableName)) {
                List v4Columns = v4TableColumns.get(tableName);
                toAnalyserCloumn(tableName, v4Columns, v41Columns);
            }
        });
        FileUtils.addContent("要添加的字段.sql", addColumns.toString());
        // 实际没有执行该脚本。有少许脏数据。没啥影响。
        FileUtils.addContent("要移除字段.sql", dropColumns.toString());
    }

    private void toAnalyserCloumn(String tableName, List v4Columns, List v41Columns) {
        List v4ColumnNames = new ArrayList<>();
        List v41ColumnNames = new ArrayList<>();

        for (GenTableColumn v4Column : v4Columns) {
            v4ColumnNames .add(v4Column.getColnmnName().toLowerCase());
        }

        for (GenTableColumn v41Column : v41Columns) {
            v41ColumnNames.add(v41Column.getColnmnName().toLowerCase());
        }

        for (GenTableColumn v41Column : v41Columns) {
            String columnName = v41Column.getColnmnName().toLowerCase();
            if (!v4ColumnNames .contains(columnName)) {
                String jdbcType = v41Column.getJdbcType();
                String columnType = jdbcType.toLowerCase();
                String sql = "alter table %s add %s  %s;" + System.lineSeparator();

                if (jdbcType.contains("char")) {
                    Long colnmnLength = v41Column.getColnmnLength();
                    jdbcType = jdbcType + "(" + colnmnLength + ")";
                }
                String format = String.format(sql, tableName, columnName, jdbcType);
                addColumns.append(format);
            }
        }

        for (GenTableColumn v41Column : v4Columns) {
            String colnmnName = v41Column.getColnmnName().toLowerCase();
            if (!v41ColumnNames.contains(colnmnName)) {
                String sql = "alter table %s drop %s ;" + System.lineSeparator();
                dropColumns.append(String.format(sql, tableName, colnmnName));
            }
        }
    }
}

//文件生成效果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/963499.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号