2015-07-29 14 views
17

Sono a conoscenza dell'oggetto cursore in Django. C'è un altro modo preferito per eseguire SQL raw nelle migrazioni? Voglio introdurre il partizionamento postgresql per una delle tabelle dei miei modelli. La logica della partizione è un insieme di funzioni e trigger che devono essere aggiunti al database sul setup che vorrei automatizzare.Come eseguire SQL raw in una migrazione django

risposta

29

Un modo:

Il modo migliore che ho trovato per farlo è usare EseguiSQL:

Migrazioni contiene la classe EseguiSQL. Per fare questo:

  1. ./manage.py makemigrations --empty myApp
  2. modificare il file migrazioni creato per includere:

operations = [ migrations.RunSQL('RAW SQL CODE') ]

Come detto Nathaniel Knight, RunSQL accetta anche un parametro reverse_sql per invertire la migrazione. See the docs for details

altro modo

Il modo risolto il problema inizialmente stava usando il segnale post_migrate di chiamare un cursore per eseguire il mio SQL prime.

Quello che avevo da aggiungere alla mia applicazione è stata questa:

nel __init__.py di myApp aggiungere:

default_app_config = 'myApp.apps.MyAppConfig' 

Creare un file apps.py:

from django.apps import AppConfig 
from django.db.models.signals import post_migrate 
from myApp.db_partition_triggers import create_partition_triggers 


class MyAppConfig(AppConfig): 
    name = 'myApp' 
    verbose_name = "My App" 

    def ready(self): 
     post_migrate.connect(create_partition_triggers, sender=self) 

Nuovo file db_partition_triggers.py:

from django.db import connection 


def create_partition_triggers(**kwargs): 
    print ' (re)creating partition triggers for myApp...' 
    trigger_sql = "CREATE OR REPLACE FUNCTION...; IF NOT EXISTS(...) CREATE TRIGGER..." 
    cursor = connection.cursor() 
    cursor.execute(trigger_sql) 
    print ' Done creating partition triggers.' 

Ora su ogni manage.py syncdb o manage.py migrate viene chiamata questa funzione. Quindi assicurati che usi CREATE OR REPLACE e IF NOT EXISTS. Quindi può gestire le funzioni esistenti.

+0

C'è un modo per aggiungere backwards-migration per suctom sql? – DataGreed

+0

Dovresti davvero spostare la nota su RunSQL in alto. È assolutamente il modo migliore per farlo ... –

+0

@DataGreed Non sei sicuro di voler sapere, ma puoi passare una seconda stringa SQL da utilizzare come sql inverso. – LarrikJ

Problemi correlati