Jedna cesta:
Nejlepší způsob, jak to udělat, je použití RunSQL:
Migrace obsahuje třídu RunSQL. Postup:
./manage.py makemigrations --empty myApp
- upravte vytvořený soubor migrace tak, aby obsahoval:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Jak zmínil Nathaniel Knight, RunSQL
také přijímá reverse_sql
parametr pro zrušení migrace. Podrobnosti naleznete v dokumentaci
Jiný způsob
Způsob, jakým jsem svůj problém původně vyřešil, byl pomocí post_migrate
signál pro volání kurzoru pro provedení mého nezpracovaného SQL.
Do své aplikace jsem musel přidat toto:
v __init__.py
z myApp add:
default_app_config = 'myApp.apps.MyAppConfig'
Vytvořte soubor 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)
Nový soubor 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.'
Nyní na každém manage.py syncdb
nebo manage.py migrate
tato funkce se nazývá. Ujistěte se tedy, že používá CREATE OR REPLACE
a IF NOT EXISTS
. Zvládne tedy stávající funkce.