from django.db import migrations, connections from core.redis import start_job_async_or_sync from core.models import AsyncMigrationStatus import logging logger = logging.getLogger(__name__) migration_name = '0033_projects_soft_delete_indexes_async' def forward_migration(migration_name, db_alias): rec = AsyncMigrationStatus.objects.using(db_alias).create(name=migration_name, status=AsyncMigrationStatus.STATUS_STARTED) conn = connections[db_alias] if conn.vendor == 'postgresql': sqls = [ 'CREATE INDEX CONCURRENTLY IF NOT EXISTS project_org_deleted_idx ON project (organization_id, deleted_at)', 'CREATE INDEX CONCURRENTLY IF NOT EXISTS project_deleted_at_idx ON project (deleted_at)', 'CREATE INDEX CONCURRENTLY IF NOT EXISTS project_purge_at_idx ON project (purge_at)', ] else: sqls = [ 'CREATE INDEX IF NOT EXISTS project_org_deleted_idx ON project (organization_id, deleted_at)', 'CREATE INDEX IF NOT EXISTS project_deleted_at_idx ON project (deleted_at)', 'CREATE INDEX IF NOT EXISTS project_purge_at_idx ON project (purge_at)', ] with conn.cursor() as c: for sql in sqls: c.execute(sql) rec.status = AsyncMigrationStatus.STATUS_FINISHED rec.save(using=db_alias) def reverse_migration(migration_name, db_alias): rec = AsyncMigrationStatus.objects.using(db_alias).create(name=migration_name, status=AsyncMigrationStatus.STATUS_STARTED) conn = connections[db_alias] if conn.vendor == 'postgresql': sqls = [ 'DROP INDEX CONCURRENTLY IF EXISTS project_org_deleted_idx', 'DROP INDEX CONCURRENTLY IF EXISTS project_deleted_at_idx', 'DROP INDEX CONCURRENTLY IF EXISTS project_purge_at_idx', ] else: sqls = [ 'DROP INDEX IF EXISTS project_org_deleted_idx', 'DROP INDEX IF EXISTS project_deleted_at_idx', 'DROP INDEX IF EXISTS project_purge_at_idx', ] with conn.cursor() as c: for sql in sqls: c.execute(sql) rec.status = AsyncMigrationStatus.STATUS_FINISHED rec.save(using=db_alias) def forwards(apps, schema_editor): db_alias = schema_editor.connection.alias start_job_async_or_sync(forward_migration, migration_name=migration_name, db_alias=db_alias) def backwards(apps, schema_editor): db_alias = schema_editor.connection.alias start_job_async_or_sync(reverse_migration, migration_name=migration_name, db_alias=db_alias) class Migration(migrations.Migration): atomic = False dependencies = [ ('projects', '0032_project_deleted_at_project_deleted_by_and_more'), ] operations = [ migrations.RunPython(forwards, backwards), ]