数据库对比脚本,java如何对比两个数据库的表字段的不同

news2024/11/27 11:41:04

因为有时候开发环境和 测试环境,有时候会有不同的数据库表,比如有些加字段了,所以这个脚本就实现了对比两个数据库连接的数据库到底哪里不一样,输出到控制台

package com.junfun.pms;

import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.util.*;

@Slf4j
public class CompareDB {

    public static void main(String[] args) throws SQLException {
        CompareDB.extracted();
    }

    private static void extracted() throws SQLException {

        String url1 = "jdbc:mysql://127.0.0.1:3306/ccgdc-pms";  // 客户展示数据库
        String user1 = "root";
        String password1 = "123456";
        String driverClass1 = "com.mysql.cj.jdbc.Driver";
        Connection conn1 = getConnection(url1, user1, password1, driverClass1);

        String url2 = "jdbc:mysql://192.168.0.66:3306/ccgdc-pms";      // 开发数据库
        String user2 = "root";
        String password2 = "Junfun1907!*%$slowkf";
        String driverClass2 = "com.mysql.cj.jdbc.Driver";
        Connection conn2 = getConnection(url2, user2, password2, driverClass2);

        compareTables(conn1, conn2);

        conn1.close();
        conn2.close();
    }

    private static Connection getConnection(String url, String user, String password, String driverClass) throws SQLException {
        try {
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return DriverManager.getConnection(url, user, password);
    }

    private static void compareTables(Connection conn1, Connection conn2) throws SQLException {
        DatabaseMetaData meta1 = conn1.getMetaData();
        DatabaseMetaData meta2 = conn2.getMetaData();

        // 指定需要对比的数据库名称
        String specifiedDatabaseName = "ccgdc-pms";

        ResultSet tables1 = meta1.getTables(null, null, null, new String[]{"TABLE"});
        while (tables1.next()) {
            String tableName = tables1.getString("TABLE_NAME");

            // 获取表所属的数据库名称
            String databaseName = tables1.getString("TABLE_CAT");

            if (specifiedDatabaseName.equals(databaseName)) {

                List<String> columns1 = getColumnsForTable(meta1, tableName);
                List<String> columns2 = getColumnsForTable(meta2, tableName);

                if (!columns1.equals(columns2)) {
                    log.info("\u001B[31m表 " + tableName + " 有不同的字段:\u001B[0m");
                    log.info("\u001B[34mDatabase 1 columns: " + columns1 + "\u001B[0m");
                    log.info("\u001B[35mDatabase 2 columns: " + columns2 + "\u001B[0m");


                    List<String> extraColumns = new ArrayList<>(columns2);
                    extraColumns.removeAll(columns1);
                    if (!extraColumns.isEmpty()) {
//                    log.info("\u001B[31m多出的字段: " + extraColumns + "\u001B[0m");
                    }

                } else {
//                log.info("表 " + tableName + " 字段一致: " + columns1);
                }
            }
        }
    }

    private static List<String> getColumnsForTable(DatabaseMetaData meta, String tableName) throws SQLException {
        Set<String> columns = new LinkedHashSet<>();
        ResultSet columnsResult = meta.getColumns(null, null, tableName, null);
        while (columnsResult.next()) {
            String columnName = columnsResult.getString("COLUMN_NAME");
            columns.add(columnName);
        }
        //将columns 转成list
        List<String> columnsList = new ArrayList<>(columns);
        return columnsList;
    }
}

输出后的情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1874527.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UE5.3】笔记6-第一个简单小游戏

打砖块小游戏&#xff1a; 1、制造一面砖块组成的墙 在关卡中放置一个cube&#xff0c;放这地面上&#xff0c;将其转换成蓝图类,改名BP_Cube&#xff0c;更换砖块的贴图&#xff0c;按住alt键进行拷贝&#xff0c;堆出一面墙&#xff0c;复制出来的会很多&#xff0c;全选移动…

【深度学习】卷积神经网络CNN

李宏毅深度学习笔记 图像分类 图像可以描述为三维张量&#xff08;张量可以想成维度大于 2 的矩阵&#xff09;。一张图像是一个三维的张量&#xff0c;其中一维代表图像的宽&#xff0c;另外一维代表图像的高&#xff0c;还有一维代表图像的通道&#xff08;channel&#xff…

# [0628] Task04 DQN 算法及进阶

easy-rl PDF版本 笔记整理 P6 - P8 joyrl 比对 补充 P7 - P8 相关 代码 整理 待整理 &#xff01;&#xff01; 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链接: https://pan.baidu.com/s/1i…

BigInteger 和 BigDecimal(java)

文章目录 BigInteger(大整数&#xff09;常用构造方法常用方法 BigDecimal(大浮点数&#xff09;常用构造方法常用方法 DecimalFormat(数字格式化) BigInteger(大整数&#xff09; java.math.BigInteger。 父类&#xff1a;Number 常用构造方法 构造方法&#xff1a;BigIntege…

实操Nginx+Tomcat多实例部署,实现负载均衡和动静分离

192.168.10.10 192.168.10.20 192.168.10.30 location ~ \.jsp$ {proxy_pass http://192.168.10.50:8080;} location ~ \.(jsp|html)$ {root /usr/share/nginx/html;}192.168.10.40和192.168.10.50用脚本完成搭建此处安装附上脚本&#xff1a; #!/bin/bash# 定义变量 JDK_PACKA…

破解对LabVIEW的偏见

LabVIEW被广泛应用于科学研究、工程测试和自动化控制领域&#xff0c;具有专业性和高效的开发能力。尽管有人对其存在偏见&#xff0c;认为不如C语言&#xff0c;但LabVIEW的图形化编程、强大集成能力、丰富社区支持和专业功能&#xff0c;使其在许多实际应用中表现出色。通过多…

Linux——数据流和重定向,制作镜像

1. 数据流 标准输入&#xff08; standard input &#xff0c;简称 stdin &#xff09;&#xff1a;默认情况下&#xff0c;标准输入指从键盘获取的输入 标准输出&#xff08; standard output &#xff0c;简称 stdout &#xff09;&#xff1a;默认情况下&#xff0c;命令…

如何将个人电脑做P2V备份到虚拟化平台

背景&#xff1a;公司员工个人电脑绑定了商用软件的license&#xff0c;现在员工离职&#xff0c;license又需要使用&#xff0c;电脑就一直被占用。 解决方法&#xff1a;利用VMware Vcenter Converter Standalone将此台式电脑上载到公司虚拟化平台上 具体做法&#xff0c;下…

【Pyspark-驯化】spark中高效保存数据到hive表中:stored as PARQUET

【Pyspark-驯化】spark中高效保存数据到hive表中&#xff1a;stored as PARQUET 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关…

WEB攻防【6】——Python考点/CTF与CMS/SSTI模板注入/PYC反编译

#知识点 1、PYC文件反编译 2、python-web-SSTI 3、SSTI模板注入利用分析 SSTI 就是服务器端模板注入 &#xff08;Server-Side Template Injection&#xff09; 当前使用的一些框架&#xff0c;比如python的flask&#xff0c;php的tp&#xff0c;java的spring等一般都采用成…

2, 搭建springCloud 项目 测试demo

上篇文章 新建了父依赖服务&#xff0c;这篇文章就建两个demo测试服务。 因为后面需要做服务间的通讯测试&#xff0c;所以至少需要建两个服务 建个子模块 同样的方式建连个demo服务 给java 和resources目录添加属性 在resources目录下建一个applications.yml文件&#xff0c;…

如何评估CRM客户系统的功能是否满足助贷机构的需求?

评估 CRM 客户系统的功能是否满足助贷机构的需求&#xff0c;可以从以下几个方面入手&#xff1a; 1. 客户信息管理 - 检查系统能否全面、准确地记录客户的基本信息&#xff0c;如个人身份、财务状况、贷款需求等。 - 确认是否支持多维度的客户分类和标签功能&#xff0c;以…

Linux Redis 服务设置开机自启动

文章目录 前言一、准备工作二、操作步骤2.1 修改redis.conf文件2.2 创建启动脚本2.3 设置redis 脚本权限2.4 设置开机启动2.5 验证 总结 前言 请各大网友尊重本人原创知识分享&#xff0c;谨记本人博客&#xff1a;南国以南i、 提示&#xff1a;以下是本篇文章正文内容&#x…

十步学习法,赋能程序员

大家好&#xff0c;我是码农先森。 引言 最近看了《软技能&#xff1a;代码之外的生存指南》这本书&#xff0c;对其中的 “十步学习法”。 有一些感触&#xff0c;所以将其中的内容记录并总结了下来&#xff0c;分享给大家。 程序员在学习成长的过程中&#xff0c;除了关注…

视频无法正常播放,提示0xc10100be错误代码怎么办?

有时我们在电脑上播放视频会提示“0xc10100be错误代码”&#xff0c;视频无法正常播放&#xff0c;这个视频播放问题是比较常见的问题。 通常导致出现错误代码0xc10100be的原因如下&#xff1a; 1.不正确的文件扩展名&#xff1a;如果在没有使用专用视频转换工具的情况下&…

【C++入门必备】【命名空间】【缺省略参数】【C++输入输出】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

ImageMasking-对图片做随机遮掩/块遮掩

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言从ipynb文件入手带注释的python文件modulesmask.pyutils.py 前言 1.可以去github直接下载这个项目,这样下载得到的是比较干净的版本&#xff0c;我把有注释的按…

[每周一更]-(第103期):GIT初始化子模块

文章目录 初始化和更新所有子模块分步骤操作1. 克隆包含子模块的仓库2. 初始化子模块3. 更新子模块 查看子模块状态提交子模块的更改处理子模块路径错误的问题 该问题的缘由是因为&#xff1a;在写某些代码的时候&#xff0c;仓库中有些文件夹&#xff0c;只提交了文件夹名称到…

小盒子跑大模型!基于算能BM1684X+FPGA平台实现大模型私有化部署

当前&#xff0c;在人工智能领域&#xff0c;大模型在丰富人工智能应用场景中扮演着重要的角色&#xff0c;经过不断的探索&#xff0c;大模型进入到落地的阶段。而大模型在落地过程中面临两大关键难题&#xff1a;对庞大计算资源的需求和对数据隐私与安全的考量。为应对这些挑…

龙迅#LT9721芯片适用于HDMI1.4转EDP应用功能,分辨率高达4K30HZ。

1.特点 •HDMI1.4接收器 支持最大3.4Gbps输入数据速率 支持HDMI1.4中指定的3D视频数据流 支持HDCP1.4和DDC从属EDID 支持分辨率高达4Kx2K30Hz的RGB 支持热插头检测 没有HEAC和CEC支持 •eDP1.4发射器 符合VESA eDP1.4标准 支持4车道与1.62Gbps&#xff08;RBR&…