Uma maneira:
A melhor maneira que encontrei para fazer isso é usando o RunSQL:
Migrations contém a classe RunSQL. Para fazer isso:
./manage.py makemigrations --empty myApp
- edite o arquivo de migração criado para incluir:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Como Nathaniel Knight mencionou,
RunSQL
também aceita um reverse_sql
parâmetro para reverter a migração. Consulte os documentos para obter detalhes
Outra maneira
A maneira como resolvi meu problema inicialmente foi usando o
post_migrate
sinal para chamar um cursor para executar meu SQL bruto. O que eu tive que adicionar ao meu aplicativo foi isso:
no
__init__.py
de myApp adicionar:default_app_config = 'myApp.apps.MyAppConfig'
Crie um arquivo
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)
Novo arquivo
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.'
Agora em cada
manage.py syncdb
ou manage.py migrate
esta função é chamada. Portanto, certifique-se de usar CREATE OR REPLACE
e IF NOT EXISTS
. Assim, ele pode lidar com funções existentes.