Ida:
La mejor manera que encontré para hacer esto es usando RunSQL:
Las migraciones contienen la clase RunSQL. Para hacer esto:
./manage.py makemigrations --empty myApp
- editar el archivo de migraciones creado para incluir:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Como mencionó Nathaniel Knight, RunSQL
también acepta un reverse_sql
parámetro para revertir la migración. Consulte los documentos para obtener más información
Otra manera
La forma en que resolví mi problema inicialmente fue usando post_migrate
señal para llamar a un cursor para ejecutar mi SQL sin formato.
Lo que tuve que agregar a mi aplicación fue esto:
en el __init__.py
de myApp añadir:
default_app_config = 'myApp.apps.MyAppConfig'
Crea un archivo 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)
Nuevo archivo 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.'
Ahora en cada manage.py syncdb
o manage.py migrate
esta función se llama. Así que asegúrese de que use CREATE OR REPLACE
y IF NOT EXISTS
. Por lo tanto, puede manejar las funciones existentes.