diff --git a/crates/erp-server/migration/src/lib.rs b/crates/erp-server/migration/src/lib.rs index 33746c3..fcf1665 100644 --- a/crates/erp-server/migration/src/lib.rs +++ b/crates/erp-server/migration/src/lib.rs @@ -56,6 +56,7 @@ mod m20260513_000144_enforce_version_optimistic_lock; mod m20260518_000149_fix_admin_permissions; mod m20260529_000169_supplement_rls_for_new_tables; mod m20260613_000170_drop_wechat_users; +mod m20260615_000171_rename_dead_letter_event_table; pub struct Migrator; @@ -117,6 +118,7 @@ impl MigratorTrait for Migrator { Box::new(m20260518_000149_fix_admin_permissions::Migration), Box::new(m20260529_000169_supplement_rls_for_new_tables::Migration), Box::new(m20260613_000170_drop_wechat_users::Migration), + Box::new(m20260615_000171_rename_dead_letter_event_table::Migration), ] } } diff --git a/crates/erp-server/migration/src/m20260615_000171_rename_dead_letter_event_table.rs b/crates/erp-server/migration/src/m20260615_000171_rename_dead_letter_event_table.rs new file mode 100644 index 0000000..eeef409 --- /dev/null +++ b/crates/erp-server/migration/src/m20260615_000171_rename_dead_letter_event_table.rs @@ -0,0 +1,59 @@ +use sea_orm_migration::prelude::*; + +/// 修复 dead_letter_events 表名不一致(backport 自 io_erp m20260614_000197)。 +/// +/// 历史迁移 m20260428_000091 的 enum 名为 `DeadLetterEvent`(单数),DeriveIden +/// 派生时 Table 变体取 enum 名的蛇形 → 实际创建的表是 `dead_letter_event`(单数)。 +/// 但 erp-core entity `dead_letter_event.rs` 的 `table_name = "dead_letter_events"` +/// (复数),导致 consume_with_retry 的 insert_dead_letter 查询「关系 dead_letter_events +/// 不存在」,dead-letter 兜底功能自基座以来从未生效。 +/// +/// 本迁移将表 rename 为复数形式,与 entity 对齐。生产库若已存在单数表则 rename, +/// 若不存在(新建库,091 迁移刚建的单数表)同样 rename。 +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // 先确认当前表名(单数存在 / 复数已存在 / 都不存在) + let singular_exists = manager + .has_table("dead_letter_event") + .await + .unwrap_or(false); + let plural_exists = manager + .has_table("dead_letter_events") + .await + .unwrap_or(false); + + if singular_exists && !plural_exists { + // 标准情况:091 迁移建了单数表,rename 为复数 + manager + .get_connection() + .execute_unprepared("ALTER TABLE \"dead_letter_event\" RENAME TO \"dead_letter_events\"") + .await?; + } + // 若 plural_exists:已修复(幂等,no-op) + // 若都不存在:091 迁移未跑或被回滚,无需处理 + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + // 回滚为单数(恢复 091 迁移的原始错误表名) + let plural_exists = manager + .has_table("dead_letter_events") + .await + .unwrap_or(false); + let singular_exists = manager + .has_table("dead_letter_event") + .await + .unwrap_or(false); + if plural_exists && !singular_exists { + manager + .get_connection() + .execute_unprepared("ALTER TABLE \"dead_letter_events\" RENAME TO \"dead_letter_event\"") + .await?; + } + Ok(()) + } +}