Enkele reis:
De beste manier die ik heb gevonden om dit te doen, is door RunSQL te gebruiken:
Migraties bevat de RunSQL-klasse. Om dit te doen:
./manage.py makemigrations --empty myApp
- bewerk het gemaakte migratiebestand met:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Zoals Nathaniel Knight al zei, RunSQL
accepteert ook een reverse_sql
parameter voor het terugdraaien van de migratie. Zie de documenten voor details
Een andere manier
De manier waarop ik mijn probleem aanvankelijk oploste, was het gebruik van de post_migrate
signaal om een cursor aan te roepen om mijn onbewerkte SQL uit te voeren.
Wat ik aan mijn app moest toevoegen was dit:
in de __init__.py
van myApp toevoegen:
default_app_config = 'myApp.apps.MyAppConfig'
Maak een bestand 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)
Nieuw bestand 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 op elke manage.py syncdb
of manage.py migrate
deze functie wordt aangeroepen. Zorg er dus voor dat het CREATE OR REPLACE
gebruikt en IF NOT EXISTS
. Dus het kan bestaande functies aan.