fix: config.0013 兼容线上无 unique 约束
This commit is contained in:
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),
|
||||
],
|
||||
),
|
||||
]
|
||||
Reference in new issue
Block a user