From 91c04ff3257b9ba557217caf78f97ceb1ae0bdb2 Mon Sep 17 00:00:00 2001 From: orris-inc Date: Fri, 6 Feb 2026 11:05:36 +0800 Subject: [PATCH] fix: make migration 050 idempotent to handle partially applied state Use stored procedure with IF NOT EXISTS checks to avoid duplicate column errors when the migration was partially applied but not recorded by goose. --- .../050_add_schedule_config_fields.sql | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/internal/infrastructure/migration/scripts/050_add_schedule_config_fields.sql b/internal/infrastructure/migration/scripts/050_add_schedule_config_fields.sql index ef6d8db..0aaa824 100644 --- a/internal/infrastructure/migration/scripts/050_add_schedule_config_fields.sql +++ b/internal/infrastructure/migration/scripts/050_add_schedule_config_fields.sql @@ -1,17 +1,42 @@ -- +goose Up -- +goose StatementBegin -ALTER TABLE admin_telegram_bindings - ADD COLUMN daily_summary_hour INT NOT NULL DEFAULT 9, - ADD COLUMN weekly_summary_hour INT NOT NULL DEFAULT 9, - ADD COLUMN weekly_summary_weekday INT NOT NULL DEFAULT 1, - ADD COLUMN offline_check_interval_minutes INT NOT NULL DEFAULT 5; +DROP PROCEDURE IF EXISTS add_schedule_config_fields; +-- +goose StatementEnd + +-- +goose StatementBegin +CREATE PROCEDURE add_schedule_config_fields() +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'admin_telegram_bindings' AND column_name = 'daily_summary_hour') THEN + ALTER TABLE admin_telegram_bindings ADD COLUMN daily_summary_hour INT NOT NULL DEFAULT 9; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'admin_telegram_bindings' AND column_name = 'weekly_summary_hour') THEN + ALTER TABLE admin_telegram_bindings ADD COLUMN weekly_summary_hour INT NOT NULL DEFAULT 9; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'admin_telegram_bindings' AND column_name = 'weekly_summary_weekday') THEN + ALTER TABLE admin_telegram_bindings ADD COLUMN weekly_summary_weekday INT NOT NULL DEFAULT 1; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema = DATABASE() AND table_name = 'admin_telegram_bindings' AND column_name = 'offline_check_interval_minutes') THEN + ALTER TABLE admin_telegram_bindings ADD COLUMN offline_check_interval_minutes INT NOT NULL DEFAULT 5; + END IF; +END; +-- +goose StatementEnd + +-- +goose StatementBegin +CALL add_schedule_config_fields(); +-- +goose StatementEnd + +-- +goose StatementBegin +DROP PROCEDURE IF EXISTS add_schedule_config_fields; -- +goose StatementEnd -- +goose Down -- +goose StatementBegin ALTER TABLE admin_telegram_bindings - DROP COLUMN daily_summary_hour, - DROP COLUMN weekly_summary_hour, - DROP COLUMN weekly_summary_weekday, - DROP COLUMN offline_check_interval_minutes; + DROP COLUMN IF EXISTS daily_summary_hour, + DROP COLUMN IF EXISTS weekly_summary_hour, + DROP COLUMN IF EXISTS weekly_summary_weekday, + DROP COLUMN IF EXISTS offline_check_interval_minutes; -- +goose StatementEnd