微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgresql转mysql生成数据库脚本

package com.wujh.util.sql;


import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.sqlException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
* postgresqlMysqL生成数据库脚本
*
* @author wujianh
*
*/
public class PostgresqlConvertMysqL {


private static Map<String,Object> tableMap = Collections
.synchronizedMap(new HashMap<String,Object>());


/**
* 读取配置文件获取连接数据库数据库
*
* @return String 数据库
*/
public static Connection getConnection() {
// 声明Connection对象
Connection con;
// 驱动程序名
String driver = "org.postgresql.Driver";
// URL指向要访问的数据库名mydata
String url = "jdbc:postgresql://192.16.51.172:5432/web";
// MysqL配置时的用户名
String user = "web";
// MysqL配置时的密码
String password = "web";
// 遍历查询结果集
try {
// 加载驱动程序
Class.forName(driver);
// 1.getConnection()方法,连接MysqL数据库!!
con = DriverManager.getConnection(url,user,password);


return con;
} catch (ClassNotFoundException e) {
// 数据库驱动类异常处理
System.out.println("Sorry,can`t find the Driver!");
e.printstacktrace();
} catch (sqlException e) {
// 数据库连接失败异常处理
e.printstacktrace();
} catch (Exception e) {
// Todo: handle exception
e.printstacktrace();
} finally {
// System.out.println("数据库数据成功获取!!");
}
return null;
}


/**
* 获取指定数据库用户的所有表名
*
* @param conn
* 连接数据库对象
* @param user
* 用户
* @param database
* 数据库
* @return
*/
public static List<String> getAllTableNames(Connection conn,String user,
String database) {


List<String> tableNames = new ArrayList<String>();
if (conn != null) {
try {
DatabaseMetaData dbmd = conn.getMetaData();
// 表名列表
ResultSet rest = dbmd.getTables(database,null,
new String[] { "TABLE" });
// 输出 table_name
while (rest.next()) {
String tableSchem = rest.getString("TABLE_SCHEM");
if (user.equalsIgnoreCase(tableSchem)) {
tableNames.add(rest.getString("TABLE_NAME"));
}
}
} catch (sqlException e) {
e.printstacktrace();
}
}
return tableNames;
}


public static void main(String[] args) throws sqlException {


Connection conn = getConnection();
Statement statement = conn.createStatement();


/**
* 1.获取表名注释
*/
String tablesql = "SELECT tablename,obj_description(relfilenode,'pg_class') as comment"
+ " FROM pg_tables a,pg_class b"
+ " WHERE a.tablename = b.relname "
+ " and a.tablename NOT LIKE 'pg%' AND a.tablename NOT LIKE 'sql_%' "
+ " ORDER BY a.tablename";
// 用来获取表中所有列的注释
ResultSet tableRs = statement.executeQuery(tablesql);
String tableName = null;
String tableComment = null;
while (tableRs.next()) {
tableName = tableRs.getString("tablename");
tableComment = tableRs.getString("comment") == null ? ""
: tableRs.getString("comment");
if (null == tableName || "".equals(tableName)) {
continue;
}
tableMap.put(tableName,tableComment);
}
tableRs.close();


StringBuffer sb = null;
List<String> tables = getAllTableNames(conn,"public","mcrc_web");
for (String table : tables) {
if (null == table || "".equals(table)) {
continue;
}


/**
* 2.获取主键,存在问题:多个字段组合的主键,只出来一个
*/
String pksql = "select pg_constraint.conname as pk_name,pg_attribute.attname as colname,pg_type.typname as typename from"
+ " pg_constraint inner join pg_class on pg_constraint.conrelid = pg_class.oid "
+ " inner join pg_attribute on pg_attribute.attrelid = pg_class.oid "
+ " and pg_attribute.attnum = pg_constraint.conkey[1]"
+ " inner join pg_type on pg_type.oid = pg_attribute.atttypid"
+ " where pg_class.relname = '" + table + "' "
+ " and pg_constraint.contype='p'";
// 用来获取表中所有列的注释
ResultSet pkRs = statement.executeQuery(pksql);
String pkName = null;
while (pkRs.next()) {
pkName = pkRs.getString("colname") == null ? ""
: pkRs.getString("colname");
}
pkRs.close();


/**
* 3.获取表中所有列
*/
String sql = "SELECT col_description(a.attrelid,a.attnum) as comment,format_type(a.atttypid,a.atttypmod) as type,"
+ "a.attname as name,a.attnotnull as notnull "
+ "FROM pg_class as c,pg_attribute as a "
+ "where c.relname = '" + table
+ "' and a.attrelid = c.oid and a.attnum>0";
// 用来获取表中所有列的结果集
ResultSet rs = statement.executeQuery(sql);


sb = new StringBuffer();
sb.append("CREATE TABLE " + table + " (");
sb.append(" \r\n");
String comment = null;
String type = null;
String name = null;
String notnull = null;


while (rs.next()) {
comment = rs.getString("comment") == null ? ""
: rs.getString("comment");
type = rs.getString("type");
name = rs.getString("name");
notnull = rs.getString("notnull");


String nullFlag = null;
if ("t".equalsIgnoreCase(notnull)) {
nullFlag = " DEFAULT NULL COMMENT ";
} else if ("f".equalsIgnoreCase(notnull)) {
nullFlag = " NOT NULL COMMENT ";
}


if ("-".equals(type) && name.contains(".......")) {
continue;
} else if ("character".equalsIgnoreCase(type)) {
sb.append("" + name + " varchar"
+ type.substring(9,type.length()) + nullFlag + "'"
+ comment + "'");
} else if (type.contains("character varying")) {
sb.append("" + name + " varchar"
+ type.substring(17,type.length()) + nullFlag + "'"
+ comment + "'");
} else if (type.contains("timestamp")) {
sb.append("" + name + " datetime " + nullFlag + "'"
+ comment + "'");
} else if ("bigint".equalsIgnoreCase(type)) {
sb.append("" + name + " bigint(20) " + nullFlag + "'"
+ comment + "'");
} else if ("smallint".equalsIgnoreCase(type)) {
sb.append("" + name + " int(10) " + nullFlag + "'" + comment
+ "'");
} else {
sb.append("" + name + " " + type + " " + nullFlag + "'"
+ comment + "'");
}
sb.append(",\r\n");
}
sb.append("PRIMARY KEY (" + pkName + ") \r\n");
sb.append(
") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='"
+ tableMap.get(table) + "';");
System.out.println(sb.toString() + " \r\n");
rs.close();
}
conn.close();


}

}



/*******************生成结果*N ***********************/

CREATE TABLE z_t_mm_library ( mm_id varchar(10) DEFAULT NULL COMMENT 'Mm编号',mm_code varchar(10) DEFAULT NULL COMMENT 'Mm码',is_source int(10) NOT NULL COMMENT '来源 0:生成 1:再分配',edt_time datetime NOT NULL COMMENT '录入时间',PRIMARY KEY (mm_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Mm库表信息';

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐