Solo andata:
Il modo migliore che ho trovato per farlo è usare RunSQL:
Migrazioni contiene la classe RunSQL. Per fare questo:
./manage.py makemigrations --empty myApp
- 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.