PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come eseguo SQL non elaborato in una migrazione django

Solo andata:

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

Migrazioni contiene la classe RunSQL. Per fare questo:

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

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

Come menzionato da Nathaniel Knight, RunSQL accetta anche un reverse_sql parametro per annullare la migrazione. Consulta i documenti per i dettagli

Un altro modo

Il modo in cui ho risolto il mio problema inizialmente era l'utilizzo di post_migrate segnale per chiamare un cursore per eseguire il mio SQL grezzo.

Quello che dovevo aggiungere alla mia app era questo:

nel __init__.py di miaApp aggiungi:

default_app_config = 'myApp.apps.MyAppConfig'

Crea 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 questa funzione viene chiamata. Quindi assicurati che utilizzi CREATE OR REPLACE e IF NOT EXISTS . Quindi può gestire le funzioni esistenti.