Eine Richtung:
Der beste Weg, den ich dafür gefunden habe, ist die Verwendung von RunSQL:
Migrationen enthält die RunSQL-Klasse. Dazu:
./manage.py makemigrations --empty myApp
- Bearbeiten Sie die erstellte Migrationsdatei so, dass sie Folgendes enthält:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Wie Nathaniel Knight erwähnte, RunSQL
akzeptiert auch ein reverse_sql
Parameter zum Rückgängigmachen der Migration. Einzelheiten finden Sie in der Dokumentation
Ein anderer Weg
Die Art und Weise, wie ich mein Problem ursprünglich gelöst habe, war die Verwendung von post_migrate
Signal zum Aufrufen eines Cursors zum Ausführen meines Roh-SQL.
Was ich zu meiner App hinzufügen musste, war Folgendes:
in der __init__.py
von myApp hinzufügen:
default_app_config = 'myApp.apps.MyAppConfig'
Erstellen Sie eine Datei 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)
Neue Datei 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.'
Jetzt auf jeder manage.py syncdb
oder manage.py migrate
Diese Funktion wird aufgerufen. Stellen Sie also sicher, dass es CREATE OR REPLACE
verwendet und IF NOT EXISTS
. Es kann also mit bestehenden Funktionen umgehen.