前言:公司有开发环境数据库,生产环境数据库。小伙伴在开发环境更换了数据库字段,导致上线到生产环境时数据库字段不一致,所有写啦一个数据库对比工具分享给大家!!

public static final String SQLForGetTables = "select * from pg_tables WHERE schemaname='public'";
public static int tableAccount = 0;
public static int columnAccount = 0;
public static String tableMessage1 ;
public static String columnMessage ;
public static String errTable;
public static String db1 = "dmp";
public static String db2 = "dmp";
public static String IP1 = "0.0.0.14:30757";
public static String IP2 = "0.0.0.45:31150";public static void main(String[] args) throws Exception {//开发环境Connection con1 = getConnection(IP1, db1, "postgres", "hello1234");//生产环境Connection con2 = getConnection(IP2, db2, "postgres", "hello1234");// 查询出字段名称List list = getInfos(con1, SQLForGetTables);List list2 = getInfos(con2, SQLForGetTables);System.out.println("将"+IP1+"的数据库"+db1+"与"+IP2+"数据库"+db2+"进行比较");tableMessage1="数据库"+db2+"缺少的表为: ";String res = checkTables(list, list2, con1, con2);System.out.println(tableMessage1);System.out.println("-------------------------比较完成");System.out.println();System.out.println("将"+IP2+"的数据库"+db2+"与"+IP1+"与数据库"+db1+"进行比较");tableMessage1="数据库"+db1+"缺少的表为:";res = checkTables(list2, list, con2, con1);System.out.println(tableMessage1);System.out.println("-------------------------比较完成");System.out.println("这两个数据库中 有"+tableAccount+"个表不相同");System.out.println("这两个数据库中 有"+columnAccount+"个字段不相同");
}private static Connection getConnection(String ip, String dbName, String user, String pwd) throws ClassNotFoundException {Connection con = null;//String url1 = "jdbc:postgresql://10.70.21.14:30757/dmp";String url1 = "jdbc:postgresql://"+ip+"/"+dbName+"";Class.forName("org.postgresql.Driver");try {con = DriverManager.getConnection(url1, user, pwd);//如何用一个参数连接} catch (SQLException e) {System.out.println("开发环境数据库连接失败:" + e.getMessage());}return con;
}// 比较两个LIST中的数据是否一致
@SuppressWarnings("rawtypes")
private static String checkTables(List list, List list2, Connection con1, Connection con2) {// 先将数据库1的数据与2比较int table = 0;int colum = 0;for (Object object : list) {table = 0;for (Object object2 : list2) {if (object.equals(object2)) {colum = checkDetail(object, object2, con1, con2);table = 1;continue;}}if (table == 0) {errTable = getName(object);tableAccount++;tableMessage1 = tableMessage1 + getName(object) + "; ";table = 1;continue;}}if (table == 0 && colum == 0) {return "两个数据库中表和字段一致";}if (table == 0 && colum == 1) {return "两个数据库中表一致 字段不一致";}if (table == 1 && colum == 0) {return "两个数据库中表不一致 字段一致";} elsereturn "两个数据库中表不一致 字段也不一致";
}// 比较两个表字段是否一致
@SuppressWarnings("rawtypes")
private static int checkDetail(Object object, Object object2, Connection con1, Connection con2) {// 获得表的名字String table = getName(object);errTable = table;String sql = "SELECT A.attname FROM pg_catalog.pg_attribute A WHERE 1 = 1 AND A.attrelid = ( SELECT oid FROM pg_class WHERE relname = '" + table + "' ) AND A.attnum > 0 AND NOT A.attisdropped ORDER BY A.attnum";// 查询出字段名称List list = getInfos(con1, sql);List list2 = getInfos(con2, sql);return checkColunm(list, list2);
}// 检查表中的字段是否一致
@SuppressWarnings("rawtypes")
private static int checkColunm(List list, List list2) {int res = 0;for (Object object : list) {int result = 0;for (Object object2 : list2) {// 如果这个字段在全部数据都匹配不到 则证明这个字段不匹配if (object.equals(object2)) {result = 1;break;}}if (result == 0) {columnAccount++;System.out.println("请注意 !表" + errTable + "中的" + getName(object) + "字段在后者数据库中没有");res = 1;}}return res;
}// 根据OBJECT获得name的值private static String getName(Object object) {Map map = JSONObject.parseObject(JSONObject.toJSONString(object), Map.class);return map.get("tablename")==null?map.get("attname")==null?"":map.get("attname").toString():map.get("tablename").toString();}// 查询数据库里面的表信息
@SuppressWarnings({"rawtypes", "unchecked"})
private static List getInfos(Connection con1, String sql) {Statement stmt;List list = new ArrayList();try {stmt = con1.createStatement();ResultSet rs = stmt.executeQuery(sql);ResultSetMetaData md = rs.getMetaData();int columnCount = md.getColumnCount();while (rs.next()) {Map map = new HashMap();for (int i = 1; i <= columnCount; i++) {map.put(md.getColumnName(i), rs.getObject(i));}list.add(map);}} catch (SQLException e) {System.out.println("查询数据库里面的表信息失败:" + e.getMessage());e.printStackTrace();}return list;}

postgres数据库对比工具相关推荐

  1. mysql数据库对比工具、mysqldiff、数据库表结构变动对比

    mysql数据库对比工具.mysqldiff.数据库表结构变动对比 1.首先你要有 Navicat Premium 15,然后找到工具-结构同步 2.找到需要对比的数据库 3.点击比对 4.点击部署 ...

  2. MYSQL 数据库对比 工具类

    1.数据库链接 jdbcTemplate 2.datasource mysqldatasource 3.使用: 配置好2个数据源 配置好2个数据库名 配置好要对比的表名:主键 执行main函数 会打印 ...

  3. mysql 连接差异_和你一起从 0 实现一个数据库差异对比工具

    对比数据的痛苦 不知道你是否也像我一样,在快乐编写代码的时候,必须进行一些数据库的数据对比工作. 诚然,一般的数据差异,比如是每一行的内容不同,市场上有比较成熟的 compare2 等对比工具. 但是 ...

  4. 在线的MySQL数据库表结构对比工具

    在项目部署上线前,测试版和正式版的数据库表结构做过哪些变更,如果没有做好实时记录,那么就需要对比找出差异,否则代码部分更新后,可能导致功能异常. 数据库表结构对比的工具很多,但是为了方便部署同步的,这 ...

  5. 达梦数据库Veri对比工具管理平台的使用方法

    前言:今天大家简单介绍一下达梦数据库的一个对比工具,如何对两个库进行数据对比. 1.访问并登陆对比工具,访问地址为达梦运维服务器IP:8080/veri ,默认登陆账号密码为admin/admin. ...

  6. 【达梦数据库】数据实时同步软件 + 数据对比工具

    文章目录 前言 一.数据实时同步软件 1.1 简单介绍 1.2 模块说明 二.数据对比工具 2.1 简单介绍 2.2 架构说明 三.DMETL vs DMHS 总结 前言 达梦数据实时同步软件(DMH ...

  7. sql脚本对比工具_Java开发中用到的数据库迁移工具(flyway)

    什么是数据库版本管理? 任何web软件和应用程序都需要强大的数据库管理工具,因此开发者选择一款合适的数据库管理工具尤为重要.本文列出了几款好用的数据库管理工具(有些并非开源或免费),以供开发者们参考选 ...

  8. Pev:Postgres的可视化工具

    原文:[POSTGRES QUERY PLAN VISUALIZATION](http://tatiyants.com/postgres-query-plan-visualization/ 作者:AL ...

  9. Pgcli—自动完成和语法高亮的Postgres命令行工具

    Pgcli是一款可自动完成和语法高亮的Postgres命令行工具,由开发者 Amjith 创建而来.该项目托管在 GitHub 上. 主要特性如下: Pgcli基于prompt_toolkit编写而来 ...

最新文章

  1. 关于c++预编译符的使用
  2. tc-core-library-js学习笔记
  3. 冷板式液冷--液冷服务器(6-2)
  4. 来入门一下kotlin吧
  5. 在MySQL数据库建立多对多的数据表关系
  6. 计算机网络画出发送窗口变化,2010年7月计算机网络原理试题及答案
  7. 配置silverlight 2的开发环境
  8. @configurationproperties注解的使用_徒手使用SpringBoot自定义Starter启动器
  9. ZT: Delphi编程规范1.0.0.0 (yckxzjj )
  10. 面试经历记录——东方海外OOCL上海软件开发中心实习生
  11. matlab gpu加速,Matlab之GPU加速方法
  12. ROS2初学者教程(Dashing和Eloquent)Windows
  13. 错误“ Java:不支持发行版本5”的正确解决方案
  14. ip rule 命令
  15. python编写库存管理_python编写商品管理
  16. 和平精英小程序服务器开小差,1个BUG存在了4年 光子通过小提示说出了无法修复的原因...
  17. 图论最短路 之 弗洛伊德Floyd(详细分析)
  18. 任务分销系统云智推任务提交版拉新系统网站源码
  19. 利用ADS快速设计低噪放
  20. python怎么读汉字翻译拼音_Python 返回汉字的汉语拼音

热门文章

  1. java调用集群mahout_Mahout--用Maven构建Mahout项目(mahoutDemo)
  2. XigmaNas系统(六):VirtualBox安装xp,迅雷,百度云安装,文件共享,远程桌面
  3. 企业微信接入自研小程序流程
  4. ubuntu14.04安装mininet和floodlight
  5. 表格内容居中css样式,css表格中的内容如何居中?css表格中的文本样式介绍
  6. STM32利用定时器1控制LED闪烁
  7. oracle创建导入数据库,unix下手动创建oracle以及imp数据导入
  8. 【Python】Webpy 源码学习(转)
  9. anu - proptypes
  10. 聊聊微软的两个产品XBOX和SharePoint