From 2a962181b284a30bc41c3c32c3967ce47621e078 Mon Sep 17 00:00:00 2001 From: Akira Date: Thu, 28 Aug 2025 10:11:19 +0900 Subject: [PATCH] Fix migration 0011: Use conditional SQL for all fields removal to avoid KeyError --- rog/migrations/0011_auto_20250827_1459.py | 127 ++++++++++++++-------- 1 file changed, 80 insertions(+), 47 deletions(-) diff --git a/rog/migrations/0011_auto_20250827_1459.py b/rog/migrations/0011_auto_20250827_1459.py index d575194..8bbb107 100644 --- a/rog/migrations/0011_auto_20250827_1459.py +++ b/rog/migrations/0011_auto_20250827_1459.py @@ -93,55 +93,88 @@ class Migration(migrations.Migration): """, reverse_sql="-- No reverse SQL needed for conditional operation" ), - migrations.AddField( - model_name='entry', - name='can_access_private_events', - field=models.BooleanField(default=False, help_text='非公開イベント参加権限'), + # Entryテーブルに新しいフィールドを条件付きで追加 + migrations.RunSQL( + sql=""" + 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( - model_name='entry', - name='staff_privileges', - field=models.BooleanField(default=False, help_text='スタッフ権限フラグ'), + # GPSCheckinテーブルに新しいフィールドを条件付きで追加 + migrations.RunSQL( + sql=""" + 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( - model_name='entry', - name='team_validation_status', - field=models.CharField(choices=[('approved', 'Approved'), ('pending', 'Pending'), ('rejected', 'Rejected')], default='approved', help_text='チーム承認状況', max_length=20), - ), - migrations.AddField( - model_name='entry', - name='zekken_label', - field=models.CharField(blank=True, max_length=255, null=True), - ), - migrations.AddField( - model_name='gpscheckin', - name='create_at', - 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), + # NewEvent2テーブルに新しいフィールドを条件付きで追加 + migrations.RunSQL( + sql=""" + DO $$ + BEGIN + -- status フィールドの追加 + IF NOT EXISTS (SELECT FROM information_schema.columns WHERE table_name = 'rog_newevent2' AND column_name = 'status') THEN + ALTER TABLE rog_newevent2 ADD COLUMN status VARCHAR(20) DEFAULT 'draft'; + COMMENT ON COLUMN rog_newevent2.status IS 'イベントステータス'; + END IF; + END $$; + """, + reverse_sql="-- No reverse SQL needed for conditional operation" ), migrations.AlterModelTable( name='gpslog',