2015-05-29 18 views
8

Sto cercando di aggiungere un database multi-column index to a postgres. Ho un comando non bloccante SQL per fare questo che assomiglia a questo:Le migrazioni di django db_index vengono eseguite contemporaneamente?

CREATE INDEX CONCURRENTLY shop_product_fields_index ON shop_product (id, ...); 

Quando aggiungo db_index per il mio modello e corro la migrazione, sarà anche eseguire contemporaneamente o sarà bloccare le scritture? È possibile una migrazione simultanea in django?

risposta

1

Non esiste alcun supporto per la creazione di indici concurrent di PostgreSQL in django.

Qui è il biglietto che richiede questa funzionalità - https://code.djangoproject.com/ticket/21039

Ma invece, è possibile specificare manualmente qualsiasi operazione EseguiSQL personalizzato nella migrazione - https://docs.djangoproject.com/en/1.8/ref/migration-operations/#runsql

+0

Ah, questo è utile sapere. Grazie! – yekta

+3

Non è possibile eseguire 'CREATE INDEX CONCURRENTLY' all'interno di una transazione e AFAIK Django esegue sempre le migrazioni all'interno di una transazione (almeno su Postgres). – Pankrat

+2

@Pankrat 1.10 supporterà [migrazioni non transazionali] (https://code.djangoproject.com/ticket/25833), quindi dovrebbe essere possibile ora. – rcoup

4

Con Django 1.10 migrazioni è possibile creare un indice concomitante utilizzando RunSQL e disabilitare la transazione di wrapping rendendo la migrazione non atomica impostando atomic = False come un attributo di dati sulla migrazione:

class Migration(migrations.Migration): 
    atomic = False # disable transaction 

    dependencies = [] 

    operations = [ 
     migrations.RunSQL('CREATE INDEX CONCURRENTLY ...') 
    ]