En väg:
Det bästa sättet jag hittade för att göra detta är att använda RunSQL:
Migrations innehåller klassen RunSQL. För att göra detta:
./manage.py makemigrations --empty myApp
- redigera den skapade migreringsfilen så att den inkluderar:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Som Nathaniel Knight nämnde, RunSQL
accepterar även en reverse_sql
parameter för att vända migreringen. Se dokumenten för mer information
Ett annat sätt
Sättet jag löste mitt problem från början var att använda post_migrate
signal att anropa en markör för att köra min rå SQL.
Det jag var tvungen att lägga till i min app var detta:
i __init__.py
av myApp lägg till:
default_app_config = 'myApp.apps.MyAppConfig'
Skapa 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å varje manage.py syncdb
eller manage.py migrate
denna funktion kallas. Så se till att den använder CREATE OR REPLACE
och IF NOT EXISTS
. Så den kan hantera befintliga funktioner.