fix: config.0013 兼容线上无 unique 约束

This commit is contained in:
XingQue committed 2026-08-10 19:02:53 +08:00
1 parent 5dbd3579c8
commit 7ff18fc827
1 file changed
+56 -12
@@ -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),
],
),
]