package com.rongyichuang.tools; import org.junit.jupiter.api.Test; import java.sql.*; import java.nio.file.*; import java.util.HashMap; import java.util.Map; public class SchemaDumpTest { @Test public void dump() { String url = "jdbc:mysql://140.143.152.226:3308/ryc?useSSL=false&useUnicode=true&characterEncoding=utf8"; String user = "openai"; String pass = "Xml@uk2025"; StringBuilder sb = new StringBuilder(); sb.append("-- Database schema dump for ryc\n"); try (Connection conn = DriverManager.getConnection(url, user, pass)) { System.out.println("[SchemaDump] Connected to MySQL."); String sqlTables = "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='ryc' ORDER BY TABLE_NAME"; String sqlCols = "SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT, EXTRA, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='ryc' ORDER BY TABLE_NAME, ORDINAL_POSITION"; // Collect table comments Map tableComments = new HashMap<>(); try (Statement st = conn.createStatement(); ResultSet rt = st.executeQuery(sqlTables)) { while (rt.next()) { tableComments.put(rt.getString("TABLE_NAME"), rt.getString("TABLE_COMMENT")); } } try (Statement st = conn.createStatement(); ResultSet rc = st.executeQuery(sqlCols)) { String currentTable = null; while (rc.next()) { String table = rc.getString("TABLE_NAME"); if (!table.equals(currentTable)) { // close previous table if (currentTable != null) { int lastComma = sb.lastIndexOf(",\n"); if (lastComma >= 0) sb.delete(lastComma, lastComma + 2); sb.append("\n);\n"); } currentTable = table; String tComment = tableComments.getOrDefault(table, ""); sb.append("\n-- Table: ").append(table); if (tComment != null && !tComment.isEmpty()) { sb.append(" -- ").append(tComment); } sb.append("\n"); sb.append("CREATE TABLE ").append(table).append(" (\n"); } String col = rc.getString("COLUMN_NAME"); String type = rc.getString("COLUMN_TYPE"); String nullable = rc.getString("IS_NULLABLE"); String def = rc.getString("COLUMN_DEFAULT"); String comment = rc.getString("COLUMN_COMMENT"); String extra = rc.getString("EXTRA"); sb.append(" `").append(col).append("` ").append(type); if ("NO".equals(nullable)) sb.append(" NOT NULL"); if (def != null) { sb.append(" DEFAULT '").append(def.replace("'", "''")).append("'"); } if (extra != null && !extra.isEmpty()) sb.append(" ").append(extra); if (comment != null && !comment.isEmpty()) { sb.append(" COMMENT '").append(comment.replace("'", "''")).append("'"); } sb.append(",\n"); } if (currentTable != null) { int lastComma = sb.lastIndexOf(",\n"); if (lastComma >= 0) sb.delete(lastComma, lastComma + 2); sb.append("\n);\n"); } } } catch (Exception e) { System.err.println("[SchemaDump] Error: " + e.getMessage()); // 不中断,仍尝试写入已收集内容 } try { Path out = Paths.get("d:/code/new-ryc/db.sql"); Files.writeString(out, sb.toString()); System.out.println("[SchemaDump] Written to " + out.toString()); } catch (Exception writeErr) { System.err.println("[SchemaDump] Write file error: " + writeErr.getMessage()); } } }