From 7ff18fc827d73dfa2acb60606da9fd683f3bb60d Mon Sep 17 00:00:00 2001 From: XingQue Date: Mon, 10 Aug 2026 19:02:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20config.0013=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E7=BA=BF=E4=B8=8A=E6=97=A0=20unique=20=E7=BA=A6=E6=9D=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0013_tupianpeizhi_drop_type_unique.py | 68 +++++++++++++++---- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/config/migrations/0013_tupianpeizhi_drop_type_unique.py b/config/migrations/0013_tupianpeizhi_drop_type_unique.py index 91e6d0c..012fe18 100644 --- a/config/migrations/0013_tupianpeizhi_drop_type_unique.py +++ b/config/migrations/0013_tupianpeizhi_drop_type_unique.py @@ -1,10 +1,47 @@ -from django.db import migrations, models +from django.db import connection, migrations, models + + +def _table_indexes(table): + with connection.cursor() as cursor: + cursor.execute(f'SHOW INDEX FROM `{table}`') + rows = cursor.fetchall() + by_key = {} + for row in rows: + key_name = row[2] + col = row[4] + non_unique = row[1] + by_key.setdefault(key_name, {'cols': [], 'unique': non_unique == 0}) + by_key[key_name]['cols'].append(col) + return by_key + + +def drop_tupian_unique_add_index(apps, schema_editor): + """ + 线上可能从未真正建过 unique(club_id, ImageType)(AlterUniqueTogether 会报 0 constraints)。 + 有则删唯一;索引不存在再补。 + """ + table = 'tupianpeizhi' + indexes = _table_indexes(table) + with connection.cursor() as cursor: + for key_name, info in list(indexes.items()): + if info['unique'] and info['cols'] == ['club_id', 'ImageType']: + cursor.execute(f'ALTER TABLE `{table}` DROP INDEX `{key_name}`') + # 刷新后再判断普通索引 + indexes = _table_indexes(table) + if 'tupian_club_type_idx' not in indexes: + cursor.execute( + f'CREATE INDEX `tupian_club_type_idx` ON `{table}` (`club_id`, `ImageType`)' + ) + + +def noop_reverse(apps, schema_editor): + pass class Migration(migrations.Migration): """ 打手规则图(ImageType=1)、关注快手(3) 需支持多图; - 原先 unique(club_id, ImageType) 会挡掉第二条。默认头像(2)仍由业务层 upsert 保单条。 + 去掉 unique(club_id, ImageType)。默认头像(2)仍由业务层 upsert 保单条。 """ dependencies = [ @@ -12,15 +49,22 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AlterUniqueTogether( - name='tupianpeizhi', - unique_together=set(), - ), - migrations.AddIndex( - model_name='tupianpeizhi', - index=models.Index( - fields=['club_id', 'ImageType'], - name='tupian_club_type_idx', - ), + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.AlterUniqueTogether( + name='tupianpeizhi', + unique_together=set(), + ), + migrations.AddIndex( + model_name='tupianpeizhi', + index=models.Index( + fields=['club_id', 'ImageType'], + name='tupian_club_type_idx', + ), + ), + ], + database_operations=[ + migrations.RunPython(drop_tupian_unique_add_index, noop_reverse), + ], ), ]