fix(push): 删除 push 表中遗留的 app_id 字段
push_device_token 和 push_device_login_log 中存在 NOT NULL 的 app_id 列, 为历史遗留字段(系统已统一使用 appKey),导致 INSERT 时报错 500。 通过 PushSchemaMigrationService 新增迁移删除该字段及对应的旧索引/约束, 并重建 idx_push_device_log_user_time 索引到正确的 app_key 列。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
这个提交包含在:
父节点
74028060a8
当前提交
46b437d5c9
@ -36,6 +36,7 @@ public class PushSchemaMigrationService {
|
||||
}
|
||||
|
||||
migrate_v20260527_create_push_operation_log(emit);
|
||||
migrate_v20260626_remove_app_id(emit);
|
||||
|
||||
emit.accept("数据库迁移检查完成");
|
||||
}
|
||||
@ -79,6 +80,23 @@ public class PushSchemaMigrationService {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean columnExists(Connection conn, String table, String column) throws SQLException {
|
||||
try (ResultSet rs = conn.getMetaData().getColumns(null, null, table, column)) {
|
||||
return rs.next();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean indexExists(Connection conn, String table, String indexName) throws SQLException {
|
||||
try (ResultSet rs = conn.getMetaData().getIndexInfo(null, null, table, false, false)) {
|
||||
while (rs.next()) {
|
||||
if (indexName.equalsIgnoreCase(rs.getString("INDEX_NAME"))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ── 各版本迁移 ──────────────────────────────────────────────────────────────
|
||||
|
||||
private void migrate_v20260527_create_push_operation_log(Consumer<String> emit) {
|
||||
@ -110,4 +128,37 @@ public class PushSchemaMigrationService {
|
||||
log.error("migration {} failed", id, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void migrate_v20260626_remove_app_id(Consumer<String> emit) {
|
||||
final String id = "v20260626_remove_app_id";
|
||||
if (migrationApplied(id)) {
|
||||
emit.accept("[已应用] " + id);
|
||||
return;
|
||||
}
|
||||
try (Connection conn = dataSource.getConnection();
|
||||
Statement stmt = conn.createStatement()) {
|
||||
// push_device_token: remove legacy app_id unique key and column
|
||||
if (columnExists(conn, "push_device_token", "app_id")) {
|
||||
if (indexExists(conn, "push_device_token", "UKj2xmtmdtxgsohtp9c6exx6vl")) {
|
||||
stmt.execute("ALTER TABLE push_device_token DROP KEY UKj2xmtmdtxgsohtp9c6exx6vl");
|
||||
}
|
||||
stmt.execute("ALTER TABLE push_device_token DROP COLUMN app_id");
|
||||
}
|
||||
// push_device_login_log: rebuild index on app_key, remove app_id column
|
||||
if (columnExists(conn, "push_device_login_log", "app_id")) {
|
||||
if (indexExists(conn, "push_device_login_log", "idx_push_device_log_user_time")) {
|
||||
stmt.execute("ALTER TABLE push_device_login_log DROP INDEX idx_push_device_log_user_time");
|
||||
}
|
||||
stmt.execute("ALTER TABLE push_device_login_log DROP COLUMN app_id");
|
||||
if (!indexExists(conn, "push_device_login_log", "idx_push_device_log_user_time")) {
|
||||
stmt.execute("CREATE INDEX idx_push_device_log_user_time ON push_device_login_log (app_key, user_id, created_at)");
|
||||
}
|
||||
}
|
||||
emit.accept("[已迁移] " + id + ": 删除 push 表中遗留 app_id 字段");
|
||||
recordMigration(id, "删除 push_device_token 和 push_device_login_log 中遗留的 app_id 字段");
|
||||
} catch (Exception e) {
|
||||
emit.accept("[错误] " + id + ": " + e.getMessage());
|
||||
log.error("migration {} failed", id, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
正在加载...
在新工单中引用
屏蔽一个用户