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

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

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 转成listList<String> columnsList = new ArrayList<>(columns);return columnsList;}
}

输出后的情况

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

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

相关文章

25届最近5年北京工业大学自动化考研院校分析

北京工业大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定教…

C++进修——C++核心编程

内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制编码&#xff0c;由操作系统进行管理全局区&#xff1a;存放全局变量和静态变量以及常量栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#xff…

grpc学习golang版( 三、proto文件数据类型 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、proto语法二、proto中的标量类型三、proto中的数组类型四、p…

资料导览(持续更新)

经典推荐 多模态大模型&#xff1a;基础架构 图解DSPy&#xff1a;Prompt的时代终结者&#xff1f;&#xff01; vLLM, LMDeploy, MLC-LLM, TensorRT-LLM, and TGI的性能小实验 优雅谈大模型13&#xff1a;一文读懂LoRA/DoRA/MoRA 新鲜速递&#xff1a;图解新颖LLM的CoPE位…

C#测试调用DotnetSpider爬取网页内容

微信公众号“DotNet”的文章《.NET快速实现网页数据抓取》介绍了调用开源网页爬取模块DotnetSpider爬取cnblog网站文章的基本方式。之前学习过使用HtmlAgilityPack抓取并分析网页内容&#xff0c;DotnetSpider也依赖HtmlAgilityPack模块&#xff0c;不过前者属于轻量、高效的爬…

C++ 运算符的优先级和结合性表

优先级和结合性表 优先级运算符描述结合性1::作用域解析运算符左到右2() [] . -> --后缀运算符左到右3 -- - ! ~ * & sizeof new delete typeid一元运算符右到左4* / %乘除取模左到右5 -加法和减法左到右6<< >>左移和右移左到右7< < > >关系…

大数据开发如何管理项目

在面试的时候总是 会问起项目&#xff0c;那在大数据开发的实际工作中&#xff0c;如何做好一个项目呢&#xff1f; 目录 1. 需求分析与项目规划1.1 需求收集与梳理1.2 可行性分析1.3 项目章程与计划 2. 数据准备与处理2.1 数据源接入2.2 数据仓库建设2.3 数据质量管理 3. 系统…

【微服务】Alibaba Cloud Linux环境下Docker以及MySQL安装

部署Docker 1.安装dnf dnf是新一代的rpm软件包管理器 yum -y install dnf2.安装社区版Docker&#xff08;docker-ce&#xff09; 添加docker-ce的dnf源 dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud…

MySQL 12种锁:真实业务与流程图解析

文章目录 1. 表级锁&#xff08;Table Lock&#xff09;场景1&#xff1a;全表扫描统计 2. 行级锁&#xff08;Row Lock&#xff09;场景2&#xff1a;修改特定用户信息 3. 全局锁&#xff08;Global Lock&#xff09;场景3&#xff1a;数据备份 4. 意向锁&#xff08;Intent L…

高性能并行计算华为云实验三:蒙特卡罗算法实验

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建蒙特卡罗算法源码 3.2 Makefile的创建与编译 3.3 主机文件配置与运行监测​​​​​​​ 四、实验结果与分析 4.1 原教程对应的实验结果 4.2 改进后的实验结果 五、实验思考与总结 5.1 实验思考 5.2 实验总结…

firewalld(2)安装、配置文件、规则查询

安装firewalld 我使用的操作系统是debian 12,并没有安装firewalld。 通过apt install firewalld安装firewalld firewalld 本身是一个服务(firewalld.service),可以通过 systemctl 进行启动、停止和重启,而iptables 本身并不是一个服务,而是一个用户空间工具,被用来配置底…

论文浅尝 | 通过基于动态文档知识图谱增强的大语言模型故事理解

笔记整理&#xff1a;许方舟&#xff0c;天津大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/21286 1. 动机 基于大型 Transformer 的语言模型在需要叙事理解的各种任务上取得了令人难以置信的成功&#xff0c;包括…

python中容易错误的知识点,仅仅针对于自己

dtype 参数在创建 NumPy ndarray 对象时用于指定数组元素的数据类型。 在 NumPy 中&#xff0c;直接使用 Python 列表即可创建 ndarray 对象&#xff0c;无需使用 list() 函数。 dtype 属性正确地表示了数组中元素的数据类型&#xff0c;所以描述没有错误。实际上&#xff0c…

【Hadoop学习笔记】认识Hadoop

认识Hadoop 从网上找的课程做的笔记&#xff0c;有些图是自己理解画的&#xff0c;可能不正确&#xff0c;可以作为参考&#xff0c;有疑问的地方请直接指出&#xff0c;共同交流。 Hadoop是由Apache基金会开发的一个分布式系统基础架构&#xff0c;主要解决海量数据的存储和海…

安装mmdetection

python版本&#xff1a;3.7 torch1.10.0,torchvision0.11.0 torchaudio0.10.0 cudatoolkit11.3.1 mmdetection版本:2.11.0 mmcv-full: 根据自己的cuda版本和torch版本修改下面的网址&#xff0c;找到对应的下载并安装 https://download.openmmlab.com/mmcv/dist/cu113/torch1.…

Django ModelForm:循环展示所有字段

在Django开发中,使用ModelForm可以大大简化表单的创建和处理过程。本文将介绍如何使用ModelForm,并展示一种简洁的方法来循环显示表单中的所有字段。 1. 模型定义 首先,让我们看一下我们的模型定义: # models.py from django.db import modelsclass Classxxxx(models.Mo…

C++轻量级 线程间异步消息架构(向曾经工作的ROSA-RB以及共事的DOPRA的老兄弟们致敬)

1 啰嗦一番背景 这么多年&#xff0c;换着槽位做牛做马&#xff0c;没有什么钱途 手艺仍然很潮&#xff0c;唯有对于第一线的码农工作&#xff0c;孜孜不倦&#xff0c;其实没有啥进步&#xff0c;就是在不断地重复&#xff0c;刷熟练度&#xff0c;和同期的老兄弟们&#xf…

[OtterCTF 2018]Recovery

里克必须找回他的文件&#xff01;用于加密文件的随机密码是什么 恢复他的文件 &#xff0c;感染的文件 &#xff1f; vmware-tray.ex 前面导出的3720.dmp 查找一下 搜索主机 strings -e l 3720.dmp | grep “WIN-LO6FAF3DTFE” 主机名 后面跟着一串 代码 aDOBofVYUNVnmp7 是不…

快速应用开发(RAD):加速软件开发的关键方法

目录 前言1. 快速应用开发的概念1.1 什么是快速应用开发&#xff1f;1.2 RAD与传统开发方法的对比 2. 快速应用开发的实施步骤2.1 需求分析与规划2.2 快速原型开发2.3 用户评估与反馈2.4 迭代开发与改进2.5 最终交付与维护 3. 快速应用开发的优点与应用场景3.1 优点3.2 应用场景…

微调Llama2自我认知

一、概述 最近在学习了解大模型微调相关的内容&#xff0c;在学习的过程中也遇到了很多问题&#xff0c;所以将自己的学习过程记录下来&#xff0c;希望对大模型微调感兴趣的小伙伴提供一点帮助&#xff0c;本文主要介绍一下如何通过SFT微调Llama2的自我认知&#xff0c;先看一…