Fix migration 0011: Use conditional SQL for all fields removal to avoid KeyError

This commit is contained in:
2025-08-28 10:11:19 +09:00
parent 413bf05042
commit 2a962181b2

View File

@ -93,55 +93,88 @@ class Migration(migrations.Migration):
""", """,
reverse_sql="-- No reverse SQL needed for conditional operation" reverse_sql="-- No reverse SQL needed for conditional operation"
), ),
migrations.AddField( # Entryテーブルに新しいフィールドを条件付きで追加
model_name='entry', migrations.RunSQL(
name='can_access_private_events', sql="""
field=models.BooleanField(default=False, help_text='非公開イベント参加権限'), DO $$
BEGIN
-- can_access_private_events フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'can_access_private_events') THEN
ALTER TABLE rog_entry ADD COLUMN can_access_private_events BOOLEAN DEFAULT FALSE;
COMMENT ON COLUMN rog_entry.can_access_private_events IS '非公開イベント参加権限';
END IF;
-- staff_privileges フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'staff_privileges') THEN
ALTER TABLE rog_entry ADD COLUMN staff_privileges BOOLEAN DEFAULT FALSE;
COMMENT ON COLUMN rog_entry.staff_privileges IS 'スタッフ権限フラグ';
END IF;
-- team_validation_status フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'team_validation_status') THEN
ALTER TABLE rog_entry ADD COLUMN team_validation_status VARCHAR(20) DEFAULT 'approved';
COMMENT ON COLUMN rog_entry.team_validation_status IS 'チーム承認状況';
END IF;
-- zekken_label フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_entry' AND column_name = 'zekken_label') THEN
ALTER TABLE rog_entry ADD COLUMN zekken_label VARCHAR(255);
END IF;
END $$;
""",
reverse_sql="-- No reverse SQL needed for conditional operation"
), ),
migrations.AddField( # GPSCheckinテーブルに新しいフィールドを条件付きで追加
model_name='entry', migrations.RunSQL(
name='staff_privileges', sql="""
field=models.BooleanField(default=False, help_text='スタッフ権限フラグ'), DO $$
BEGIN
-- create_at フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'create_at') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN create_at TIMESTAMP WITH TIME ZONE;
COMMENT ON COLUMN rog_gpscheckin.create_at IS '作成日時:データの作成日時';
END IF;
-- create_user フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'create_user') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN create_user TEXT;
COMMENT ON COLUMN rog_gpscheckin.create_user IS '作成ユーザー';
END IF;
-- event_id フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'event_id') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN event_id INTEGER;
COMMENT ON COLUMN rog_gpscheckin.event_id IS 'イベントID';
END IF;
-- goal_time フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'goal_time') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN goal_time TEXT;
COMMENT ON COLUMN rog_gpscheckin.goal_time IS 'ゴール時刻=ゴール時のみ使用される。画像から時刻を読み取り設定する。';
END IF;
-- image_address フィールドの追加
IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_gpscheckin' AND column_name = 'image_address') THEN
ALTER TABLE rog_gpscheckin ADD COLUMN image_address TEXT;
COMMENT ON COLUMN rog_gpscheckin.image_address IS 'チェックイン画像のパス';
END IF;
END $$;
""",
reverse_sql="-- No reverse SQL needed for conditional operation"
), ),
migrations.AddField( # NewEvent2テーブルに新しいフィールドを条件付きで追加
model_name='entry', migrations.RunSQL(
name='team_validation_status', sql="""
field=models.CharField(choices=[('approved', 'Approved'), ('pending', 'Pending'), ('rejected', 'Rejected')], default='approved', help_text='チーム承認状況', max_length=20), DO $$
), BEGIN
migrations.AddField( -- status フィールドの追加
model_name='entry', IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_newevent2' AND column_name = 'status') THEN
name='zekken_label', ALTER TABLE rog_newevent2 ADD COLUMN status VARCHAR(20) DEFAULT 'draft';
field=models.CharField(blank=True, max_length=255, null=True), COMMENT ON COLUMN rog_newevent2.status IS 'イベントステータス';
), END IF;
migrations.AddField( END $$;
model_name='gpscheckin', """,
name='create_at', reverse_sql="-- No reverse SQL needed for conditional operation"
field=models.DateTimeField(blank=True, help_text='作成日時:データの作成日時', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='create_user',
field=models.TextField(blank=True, help_text='作成ユーザー', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='event_id',
field=models.IntegerField(blank=True, help_text='イベントID', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='goal_time',
field=models.TextField(blank=True, help_text='ゴール時刻=ゴール時のみ使用される。画像から時刻を読み取り設定する。', null=True),
),
migrations.AddField(
model_name='gpscheckin',
name='image_address',
field=models.TextField(blank=True, help_text='チェックイン画像のパス', null=True),
),
migrations.AddField(
model_name='newevent2',
name='status',
field=models.CharField(choices=[('public', 'Public'), ('private', 'Private'), ('draft', 'Draft'), ('closed', 'Closed')], default='draft', help_text='イベントステータス', max_length=20),
), ),
migrations.AlterModelTable( migrations.AlterModelTable(
name='gpslog', name='gpslog',