fix: fix migrations

This commit is contained in:
master 2025-07-04 01:25:07 +08:00
parent b5b3c77ba3
commit 5155c59293
5 changed files with 73 additions and 31 deletions

View File

@ -318,7 +318,7 @@ pub trait CustomSchemaManagerExt {
} }
async fn create_foreign_key_if_not_exists< async fn create_foreign_key_if_not_exists<
T: IntoIden + 'static + Send, T: ToString + 'static + Send,
S: IntoIden + 'static + Send, S: IntoIden + 'static + Send,
>( >(
&self, &self,
@ -328,7 +328,7 @@ pub trait CustomSchemaManagerExt {
) -> Result<(), DbErr>; ) -> Result<(), DbErr>;
async fn drop_foreign_key_if_exists< async fn drop_foreign_key_if_exists<
T: IntoIden + 'static + Send, T: ToString + 'static + Send,
S: IntoIden + 'static + Send, S: IntoIden + 'static + Send,
>( >(
&self, &self,
@ -424,7 +424,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> {
} }
async fn create_foreign_key_if_not_exists< async fn create_foreign_key_if_not_exists<
T: IntoIden + 'static + Send, T: ToString + 'static + Send,
S: IntoIden + 'static + Send, S: IntoIden + 'static + Send,
>( >(
&self, &self,
@ -432,7 +432,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> {
foreign_key: S, foreign_key: S,
stmt: ForeignKeyCreateStatement, stmt: ForeignKeyCreateStatement,
) -> Result<(), DbErr> { ) -> Result<(), DbErr> {
let from_tbl = from_tbl.into_iden().to_string(); let from_tbl = from_tbl.to_string();
let foreign_key = foreign_key.into_iden().to_string(); let foreign_key = foreign_key.into_iden().to_string();
let db = self let db = self
.get_connection() .get_connection()
@ -442,7 +442,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> {
" "
SELECT CONSTRAINT_NAME SELECT CONSTRAINT_NAME
FROM information_schema.KEY_COLUMN_USAGE FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = '{from_tbl}' AND CONSTRAINT_NAME = '{foreign_key}' WHERE TABLE_NAME = {from_tbl} AND CONSTRAINT_NAME = '{foreign_key}'
" "
), ),
)) ))
@ -457,7 +457,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> {
} }
async fn drop_foreign_key_if_exists< async fn drop_foreign_key_if_exists<
T: IntoIden + 'static + Send, T: ToString + 'static + Send,
S: IntoIden + 'static + Send, S: IntoIden + 'static + Send,
>( >(
&self, &self,
@ -465,7 +465,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> {
foreign_key: S, foreign_key: S,
stmt: ForeignKeyDropStatement, stmt: ForeignKeyDropStatement,
) -> Result<(), DbErr> { ) -> Result<(), DbErr> {
let from_tbl = from_tbl.into_iden().to_string(); let from_tbl = from_tbl.to_string();
let foreign_key = foreign_key.into_iden().to_string(); let foreign_key = foreign_key.into_iden().to_string();
let db = self let db = self
.get_connection() .get_connection()
@ -475,7 +475,7 @@ impl CustomSchemaManagerExt for SchemaManager<'_> {
" "
SELECT CONSTRAINT_NAME SELECT CONSTRAINT_NAME
FROM information_schema.KEY_COLUMN_USAGE FROM information_schema.KEY_COLUMN_USAGE
WHERE TABLE_NAME = '{from_tbl}' AND CONSTRAINT_NAME = '{foreign_key}' WHERE TABLE_NAME = {from_tbl} AND CONSTRAINT_NAME = '{foreign_key}'
" "
), ),
)) ))

View File

@ -78,7 +78,7 @@ impl MigrationTrait for Migration {
manager manager
.create_foreign_key_if_not_exists( .create_foreign_key_if_not_exists(
Subscriptions::Table, Subscriptions::Table.to_string(),
"fk_subscriptions_credential_id", "fk_subscriptions_credential_id",
ForeignKeyCreateStatement::new() ForeignKeyCreateStatement::new()
.name("fk_subscriptions_credential_id") .name("fk_subscriptions_credential_id")

View File

@ -61,7 +61,7 @@ impl MigrationTrait for Migration {
)).await?; )).await?;
db.execute_unprepared(&format!( db.execute_unprepared(&format!(
r#"CREATE OR REPLACE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ r#"CREATE OR REPLACE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$
DECLARE DECLARE
new_job_subscriber_id integer; new_job_subscriber_id integer;
new_job_subscription_id integer; new_job_subscription_id integer;
@ -70,18 +70,19 @@ impl MigrationTrait for Migration {
new_job_subscriber_id = (NEW.{job} ->> '{subscriber_id}')::integer; new_job_subscriber_id = (NEW.{job} ->> '{subscriber_id}')::integer;
new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer; new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer;
new_job_task_type = (NEW.{job} ->> '{task_type}')::text; new_job_task_type = (NEW.{job} ->> '{task_type}')::text;
IF new_job_subscriber_id != (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id != NEW.{subscriber_id} THEN IF new_job_subscriber_id IS DISTINCT FROM (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN
NEW.{subscriber_id} = new_job_subscriber_id; NEW.{subscriber_id} = new_job_subscriber_id;
END IF; END IF;
IF new_job_subscription_id != (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id != NEW.{subscription_id} THEN IF new_job_subscription_id IS DISTINCT FROM (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN
NEW.{subscription_id} = new_job_subscription_id; NEW.{subscription_id} = new_job_subscription_id;
END IF; END IF;
IF new_job_task_type != (OLD.{job} ->> '{task_type}')::text AND new_job_task_type != NEW.{task_type} THEN IF new_job_task_type IS DISTINCT FROM (OLD.{job} ->> '{task_type}')::text AND new_job_task_type IS DISTINCT FROM NEW.{task_type} THEN
NEW.{task_type} = new_job_task_type; NEW.{task_type} = new_job_task_type;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ LANGUAGE plpgsql;"#, $$ LANGUAGE plpgsql;"#,
apalis_schema = ApalisSchema::Schema.to_string(),
job = ApalisJobs::Job.to_string(), job = ApalisJobs::Job.to_string(),
subscriber_id = ApalisJobs::SubscriberId.to_string(), subscriber_id = ApalisJobs::SubscriberId.to_string(),
subscription_id = ApalisJobs::SubscriptionId.to_string(), subscription_id = ApalisJobs::SubscriptionId.to_string(),
@ -92,7 +93,7 @@ impl MigrationTrait for Migration {
r#"CREATE OR REPLACE TRIGGER {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_TRIGGER_NAME} r#"CREATE OR REPLACE TRIGGER {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_TRIGGER_NAME}
BEFORE INSERT OR UPDATE ON {apalis_schema}.{apalis_table} BEFORE INSERT OR UPDATE ON {apalis_schema}.{apalis_table}
FOR EACH ROW FOR EACH ROW
EXECUTE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}();"#, EXECUTE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}();"#,
apalis_schema = ApalisSchema::Schema.to_string(), apalis_schema = ApalisSchema::Schema.to_string(),
apalis_table = ApalisJobs::Table.to_string() apalis_table = ApalisJobs::Table.to_string()
)) ))
@ -198,7 +199,8 @@ impl MigrationTrait for Migration {
)).await?; )).await?;
db.execute_unprepared(&format!( db.execute_unprepared(&format!(
r#"DROP FUNCTION IF EXISTS {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}()"#, r#"DROP FUNCTION IF EXISTS {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}()"#,
apalis_schema = ApalisSchema::Schema.to_string(),
)) ))
.await?; .await?;

View File

@ -15,6 +15,8 @@ pub struct Migration;
#[async_trait] #[async_trait]
impl MigrationTrait for Migration { impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
let db = manager.get_connection();
create_postgres_enum_for_active_enum!(manager, EpisodeTypeEnum, EpisodeType::Mikan).await?; create_postgres_enum_for_active_enum!(manager, EpisodeTypeEnum, EpisodeType::Mikan).await?;
{ {
@ -29,11 +31,17 @@ impl MigrationTrait for Migration {
BangumiTypeEnum, BangumiTypeEnum,
BangumiType::iden_values(), BangumiType::iden_values(),
)) ))
.drop_column(Bangumi::SavePath)
.to_owned(), .to_owned(),
) )
.await?; .await?;
db.execute_unprepared(&format!(
r#"ALTER TABLE {bangumi} DROP COLUMN IF EXISTS {save_path}"#,
bangumi = Bangumi::Table.to_string(),
save_path = Bangumi::SavePath.to_string(),
))
.await?;
manager manager
.exec_stmt( .exec_stmt(
UpdateStatement::new() UpdateStatement::new()
@ -83,11 +91,17 @@ impl MigrationTrait for Migration {
.add_column_if_not_exists(big_integer_null( .add_column_if_not_exists(big_integer_null(
Episodes::EnclosureContentLength, Episodes::EnclosureContentLength,
)) ))
.drop_column(Episodes::SavePath)
.to_owned(), .to_owned(),
) )
.await?; .await?;
db.execute_unprepared(&format!(
r#"ALTER TABLE {episodes} DROP COLUMN IF EXISTS {save_path}"#,
episodes = Episodes::Table.to_string(),
save_path = Episodes::SavePath.to_string(),
))
.await?;
manager manager
.exec_stmt( .exec_stmt(
UpdateStatement::new() UpdateStatement::new()
@ -120,10 +134,34 @@ impl MigrationTrait for Migration {
} }
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.alter_table(
Table::alter()
.table(Bangumi::Table)
.add_column_if_not_exists(text_null(Bangumi::SavePath))
.drop_column(Bangumi::BangumiType)
.to_owned(),
)
.await?;
manager manager
.drop_postgres_enum_for_active_enum(BangumiTypeEnum) .drop_postgres_enum_for_active_enum(BangumiTypeEnum)
.await?; .await?;
manager
.alter_table(
Table::alter()
.table(Episodes::Table)
.add_column_if_not_exists(text_null(Episodes::SavePath))
.drop_column(Episodes::EpisodeType)
.drop_column(Episodes::EnclosureMagnetLink)
.drop_column(Episodes::EnclosureTorrentLink)
.drop_column(Episodes::EnclosurePubDate)
.drop_column(Episodes::EnclosureContentLength)
.to_owned(),
)
.await?;
manager manager
.drop_postgres_enum_for_active_enum(EpisodeTypeEnum) .drop_postgres_enum_for_active_enum(EpisodeTypeEnum)
.await?; .await?;

View File

@ -105,13 +105,13 @@ impl MigrationTrait for Migration {
new_subscriber_task_subscriber_id = (NEW.{subscriber_task_cron} ->> 'subscriber_id')::integer; new_subscriber_task_subscriber_id = (NEW.{subscriber_task_cron} ->> 'subscriber_id')::integer;
new_subscriber_task_subscription_id = (NEW.{subscriber_task_cron} ->> 'subscription_id')::integer; new_subscriber_task_subscription_id = (NEW.{subscriber_task_cron} ->> 'subscription_id')::integer;
new_system_task_subscriber_id = (NEW.{system_task_cron} ->> 'subscriber_id')::integer; new_system_task_subscriber_id = (NEW.{system_task_cron} ->> 'subscriber_id')::integer;
IF new_subscriber_task_subscriber_id != (OLD.{subscriber_task_cron} ->> 'subscriber_id')::integer AND new_subscriber_task_subscriber_id != NEW.{subscriber_id} THEN IF new_subscriber_task_subscriber_id IS DISTINCT FROM (OLD.{subscriber_task_cron} ->> 'subscriber_id')::integer AND new_subscriber_task_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN
NEW.{subscriber_id} = new_subscriber_task_subscriber_id; NEW.{subscriber_id} = new_subscriber_task_subscriber_id;
END IF; END IF;
IF new_subscriber_task_subscription_id != (OLD.{subscriber_task_cron} ->> 'subscription_id')::integer AND new_subscriber_task_subscription_id != NEW.{subscription_id} THEN IF new_subscriber_task_subscription_id IS DISTINCT FROM (OLD.{subscriber_task_cron} ->> 'subscription_id')::integer AND new_subscriber_task_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN
NEW.{subscription_id} = new_subscriber_task_subscription_id; NEW.{subscription_id} = new_subscriber_task_subscription_id;
END IF; END IF;
IF new_system_task_subscriber_id != (OLD.{system_task_cron} ->> 'subscriber_id')::integer AND new_system_task_subscriber_id != NEW.{subscriber_id} THEN IF new_system_task_subscriber_id IS DISTINCT FROM (OLD.{system_task_cron} ->> 'subscriber_id')::integer AND new_system_task_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN
NEW.{subscriber_id} = new_system_task_subscriber_id; NEW.{subscriber_id} = new_system_task_subscriber_id;
END IF; END IF;
RETURN NEW; RETURN NEW;
@ -154,8 +154,8 @@ impl MigrationTrait for Migration {
OLD.{next_run} IS NULL OLD.{next_run} IS NULL
OR OLD.{next_run} > CURRENT_TIMESTAMP OR OLD.{next_run} > CURRENT_TIMESTAMP
OR OLD.{enabled} = false OR OLD.{enabled} = false
OR OLD.{status} != '{pending}' OR OLD.{status} IS DISTINCT FROM '{pending}'
OR OLD.{attempts} != NEW.{attempts} OR OLD.{attempts} IS DISTINCT FROM NEW.{attempts}
) )
THEN THEN
PERFORM pg_notify('{CRON_DUE_EVENT}', row_to_json(NEW)::text); PERFORM pg_notify('{CRON_DUE_EVENT}', row_to_json(NEW)::text);
@ -341,7 +341,7 @@ impl MigrationTrait for Migration {
.await?; .await?;
db.execute_unprepared(&format!( db.execute_unprepared(&format!(
r#"CREATE OR REPLACE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ r#"CREATE OR REPLACE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$
DECLARE DECLARE
new_job_subscriber_id integer; new_job_subscriber_id integer;
new_job_subscription_id integer; new_job_subscription_id integer;
@ -352,21 +352,22 @@ impl MigrationTrait for Migration {
new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer; new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer;
new_job_cron_id = (NEW.{job} ->> '{cron_id}')::integer; new_job_cron_id = (NEW.{job} ->> '{cron_id}')::integer;
new_job_task_type = (NEW.{job} ->> '{task_type}')::text; new_job_task_type = (NEW.{job} ->> '{task_type}')::text;
IF new_job_subscriber_id != (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id != NEW.{subscriber_id} THEN IF new_job_subscriber_id IS DISTINCT FROM (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN
NEW.{subscriber_id} = new_job_subscriber_id; NEW.{subscriber_id} = new_job_subscriber_id;
END IF; END IF;
IF new_job_subscription_id != (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id != NEW.{subscription_id} THEN IF new_job_subscription_id IS DISTINCT FROM (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN
NEW.{subscription_id} = new_job_subscription_id; NEW.{subscription_id} = new_job_subscription_id;
END IF; END IF;
IF new_job_cron_id != (OLD.{job} ->> '{cron_id}')::integer AND new_job_cron_id != NEW.{cron_id} THEN IF new_job_cron_id IS DISTINCT FROM (OLD.{job} ->> '{cron_id}')::integer AND new_job_cron_id IS DISTINCT FROM NEW.{cron_id} THEN
NEW.{cron_id} = new_job_cron_id; NEW.{cron_id} = new_job_cron_id;
END IF; END IF;
IF new_job_task_type != (OLD.{job} ->> '{task_type}')::text AND new_job_task_type != NEW.{task_type} THEN IF new_job_task_type IS DISTINCT FROM (OLD.{job} ->> '{task_type}')::text AND new_job_task_type IS DISTINCT FROM NEW.{task_type} THEN
NEW.{task_type} = new_job_task_type; NEW.{task_type} = new_job_task_type;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ LANGUAGE plpgsql;"#, $$ LANGUAGE plpgsql;"#,
apalis_schema = ApalisSchema::Schema.to_string(),
job = ApalisJobs::Job.to_string(), job = ApalisJobs::Job.to_string(),
subscriber_id = ApalisJobs::SubscriberId.to_string(), subscriber_id = ApalisJobs::SubscriberId.to_string(),
subscription_id = ApalisJobs::SubscriptionId.to_string(), subscription_id = ApalisJobs::SubscriptionId.to_string(),
@ -381,7 +382,7 @@ impl MigrationTrait for Migration {
let db = manager.get_connection(); let db = manager.get_connection();
db.execute_unprepared(&format!( db.execute_unprepared(&format!(
r#"CREATE OR REPLACE FUNCTION {SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$ r#"CREATE OR REPLACE FUNCTION {apalis_schema}.{SETUP_APALIS_JOBS_EXTRA_FOREIGN_KEYS_FUNCTION_NAME}() RETURNS trigger AS $$
DECLARE DECLARE
new_job_subscriber_id integer; new_job_subscriber_id integer;
new_job_subscription_id integer; new_job_subscription_id integer;
@ -390,18 +391,19 @@ impl MigrationTrait for Migration {
new_job_subscriber_id = (NEW.{job} ->> '{subscriber_id}')::integer; new_job_subscriber_id = (NEW.{job} ->> '{subscriber_id}')::integer;
new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer; new_job_subscription_id = (NEW.{job} ->> '{subscription_id}')::integer;
new_job_task_type = (NEW.{job} ->> '{task_type}')::text; new_job_task_type = (NEW.{job} ->> '{task_type}')::text;
IF new_job_subscriber_id != (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id != NEW.{subscriber_id} THEN IF new_job_subscriber_id IS DISTINCT FROM (OLD.{job} ->> '{subscriber_id}')::integer AND new_job_subscriber_id IS DISTINCT FROM NEW.{subscriber_id} THEN
NEW.{subscriber_id} = new_job_subscriber_id; NEW.{subscriber_id} = new_job_subscriber_id;
END IF; END IF;
IF new_job_subscription_id != (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id != NEW.{subscription_id} THEN IF new_job_subscription_id IS DISTINCT FROM (OLD.{job} ->> '{subscription_id}')::integer AND new_job_subscription_id IS DISTINCT FROM NEW.{subscription_id} THEN
NEW.{subscription_id} = new_job_subscription_id; NEW.{subscription_id} = new_job_subscription_id;
END IF; END IF;
IF new_job_task_type != (OLD.{job} ->> '{task_type}')::text AND new_job_task_type != NEW.{task_type} THEN IF new_job_task_type IS DISTINCT FROM (OLD.{job} ->> '{task_type}')::text AND new_job_task_type IS DISTINCT FROM NEW.{task_type} THEN
NEW.{task_type} = new_job_task_type; NEW.{task_type} = new_job_task_type;
END IF; END IF;
RETURN NEW; RETURN NEW;
END; END;
$$ LANGUAGE plpgsql;"#, $$ LANGUAGE plpgsql;"#,
apalis_schema = ApalisSchema::Schema.to_string(),
job = ApalisJobs::Job.to_string(), job = ApalisJobs::Job.to_string(),
subscriber_id = ApalisJobs::SubscriberId.to_string(), subscriber_id = ApalisJobs::SubscriberId.to_string(),
subscription_id = ApalisJobs::SubscriptionId.to_string(), subscription_id = ApalisJobs::SubscriptionId.to_string(),