由于工作需要,要将原有的mysql的表结构和数据都迁移到pgsql里面,因为pgsql支持更大数据存储,还能做AI大模型的向量数据库。
网上找了很多种办法,这种跨数据库的迁移方案都是收费的。只有navicate 工具可以免费迁移,怎耐我们公司禁止使用navicate 。
没有办法,我只能首先java代码实现数据库表结构迁移工作。
下面就是代码,本打算从mysql读取所有的数据库结构直接插入到pgsql里面,但是实际却发现有很多不合理的地方,与改成了将所有的mysql结构生成pgsql 的结构打印出来。使用者可以拷贝打印出来的内容形成一个脚本再使用。
里面有类型转换我中用到我们实际使用到的结果,还有不少没列出来,使用时要注意一下。
import java.sql.*;
import java.util.*;
public class MysqlToPgsqlMigration {
private static final String MYSQL_URL = "jdbc:mysql://127.0.0.1:3306/test";
private static final String MYSQL_USER = "root";
private static final String MYSQL_PASSWORD = "root";
private static final String POSTGRESQL_URL = "jdbc:postgresql://127.0.0.1:5432/jeecg-boot";
private static final String POSTGRESQL_USER = "root";
private static final String POSTGRESQL_PASSWORD = "root1";
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
Class.forName("org.postgresql.Driver");
try (Connection mysqlConn = DriverManager.getConnection(MYSQL_URL, MYSQL_USER, MYSQL_PASSWORD);
Connection pgsqlConn = DriverManager.getConnection(POSTGRESQL_URL, POSTGRESQL_USER, POSTGRESQL_PASSWORD)) {
DatabaseMetaData mysqlMeta = mysqlConn.getMetaData();
Statement pgsqlStmt = pgsqlConn.createStatement();
ResultSet tablesRs = mysqlMeta.getTables(null, null, "%", new String[]{"TABLE"});
while (tablesRs.next()) {
String tableName = tablesRs.getString("TABLE_NAME");
// 重建表结构
StringBuilder createTableSql = new StringBuilder("CREATE TABLE ");
createTableSql.append(tableName).append(" (\n");
ResultSet columnsRs = mysqlMeta.getColumns(null, null, tableName, null);
List<String> primaryKeyColumns = new ArrayList<>();
List<String> indexKeyColumns = new ArrayList<>();
List<String> columnComments = new ArrayList<>();
List<String> uniqueindexKeyColumns = new ArrayList<>();
while (columnsRs.next()) {
String columnName = columnsRs.getString("COLUMN_NAME");
int dataType = columnsRs.getInt("DATA_TYPE");
String typeName = mapColumnType(dataType);
int size = columnsRs.getInt("COLUMN_SIZE");