ApplyLobsterMasterSchemaSync.java 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import java.nio.charset.StandardCharsets;
  2. import java.nio.file.Files;
  3. import java.nio.file.Path;
  4. import java.nio.file.Paths;
  5. import java.sql.*;
  6. /**
  7. * Apply master DB lobster DDL gaps (ylrz_saas).
  8. * Usage: java -cp mysql-connector-j.jar ApplyLobsterMasterSchemaSync
  9. */
  10. public class ApplyLobsterMasterSchemaSync {
  11. private static final String MASTER_HOST = getenv("DB_HOST", "cq-cdb-8fjmemkb.sql.tencentcdb.com");
  12. private static final int MASTER_PORT = Integer.parseInt(getenv("DB_PORT", "27220"));
  13. private static final String MASTER_USER = getenv("DB_USER", "root");
  14. private static final String MASTER_PASSWORD = getenv("DB_PASSWORD", "Ylrz_1q2w3e4r5t6y");
  15. private static final String MASTER_DB = getenv("DB_NAME", "ylrz_saas");
  16. public static void main(String[] args) throws Exception {
  17. System.out.println("========== MASTER -> " + MASTER_DB + " ==========");
  18. try (Connection conn = open(MASTER_HOST, MASTER_PORT, MASTER_DB, MASTER_USER, MASTER_PASSWORD)) {
  19. audit(conn, "before");
  20. applySqlFile(conn, "../sql/master/V20260623_02__lobster_master_word_tables.sql");
  21. applyVectorStore(conn);
  22. audit(conn, "after");
  23. }
  24. }
  25. private static void audit(Connection conn, String phase) throws SQLException {
  26. System.out.println("[AUDIT " + phase + "]");
  27. printTable(conn, "company_lobster_replace_word");
  28. printTable(conn, "company_lobster_sensitive_word");
  29. printTable(conn, "lobster_vector_store");
  30. }
  31. private static void printTable(Connection conn, String table) throws SQLException {
  32. if (tableExists(conn, table)) {
  33. System.out.println(" OK table: " + table);
  34. } else {
  35. System.out.println(" MISSING TABLE: " + table);
  36. }
  37. }
  38. private static void applyVectorStore(Connection conn) throws SQLException {
  39. if (tableExists(conn, "lobster_vector_store")) {
  40. return;
  41. }
  42. System.out.println("[APPLY] lobster_vector_store");
  43. try (Statement st = conn.createStatement()) {
  44. st.execute(
  45. "CREATE TABLE IF NOT EXISTS `lobster_vector_store` ("
  46. + "`id` bigint NOT NULL AUTO_INCREMENT,"
  47. + "`company_id` bigint NOT NULL,"
  48. + "`category` varchar(64) NOT NULL,"
  49. + "`vec_key` varchar(128) NOT NULL,"
  50. + "`text_content` text,"
  51. + "`vector` mediumtext COMMENT 'embedding JSON float[]',"
  52. + "`metadata` text COMMENT 'JSON metadata',"
  53. + "`create_time` datetime DEFAULT CURRENT_TIMESTAMP,"
  54. + "`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,"
  55. + "PRIMARY KEY (`id`),"
  56. + "UNIQUE KEY `uk_company_category_key` (`company_id`, `category`, `vec_key`),"
  57. + "KEY `idx_company_category` (`company_id`, `category`)"
  58. + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='lobster vector store'");
  59. }
  60. }
  61. private static void applySqlFile(Connection conn, String relativePath) throws Exception {
  62. Path path = Paths.get(relativePath).normalize();
  63. if (!Files.exists(path)) {
  64. path = Paths.get("java", "sql", "master", "V20260623_02__lobster_master_word_tables.sql");
  65. }
  66. if (!Files.exists(path)) {
  67. System.out.println("[SKIP] " + relativePath);
  68. return;
  69. }
  70. System.out.println("[APPLY] " + path.toAbsolutePath());
  71. String sql = Files.readString(path, StandardCharsets.UTF_8);
  72. StringBuilder batch = new StringBuilder();
  73. for (String line : sql.split("\\R")) {
  74. String trimmed = line.trim();
  75. if (trimmed.startsWith("--")) {
  76. continue;
  77. }
  78. batch.append(line).append('\n');
  79. }
  80. try (Statement st = conn.createStatement()) {
  81. st.execute(batch.toString());
  82. }
  83. }
  84. private static boolean tableExists(Connection conn, String table) throws SQLException {
  85. try (PreparedStatement ps = conn.prepareStatement(
  86. "SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?")) {
  87. ps.setString(1, table);
  88. try (ResultSet rs = ps.executeQuery()) {
  89. return rs.next() && rs.getInt(1) > 0;
  90. }
  91. }
  92. }
  93. private static Connection open(String host, int port, String database, String user, String password)
  94. throws SQLException {
  95. String url = "jdbc:mysql://" + host + ":" + port + "/" + database
  96. + "?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&allowMultiQueries=true";
  97. return DriverManager.getConnection(url, user, password);
  98. }
  99. private static String getenv(String key, String defaultValue) {
  100. String v = System.getenv(key);
  101. return v != null && !v.isEmpty() ? v : defaultValue;
  102. }
  103. }