En vej:
Den bedste måde, jeg fandt på at gøre dette på, er at bruge RunSQL:
Migrationer indeholder klassen RunSQL. For at gøre dette:
./manage.py makemigrations --empty myApp- rediger den oprettede migreringsfil, så den inkluderer:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Som Nathaniel Knight nævnte, RunSQL accepterer også en reverse_sql parameter for at vende migreringen. Se dokumenterne for detaljer
En anden måde
Den måde, jeg løste mit problem på, var ved at bruge post_migrate signal til at kalde en markør for at udføre min rå SQL.
Det, jeg skulle tilføje til min app, var dette:
i __init__.py af myApp tilføje:
default_app_config = 'myApp.apps.MyAppConfig'
Opret en fil 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)
Ny fil 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.'
Nu på hver manage.py syncdb eller manage.py migrate denne funktion kaldes. Så sørg for, at den bruger CREATE OR REPLACE og IF NOT EXISTS . Så den kan håndtere eksisterende funktioner.