sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo ejecuto SQL sin procesar en una migración de django?

Ida:

La mejor manera que encontré para hacer esto es usando RunSQL:

Las migraciones contienen la clase RunSQL. Para hacer esto:

  1. ./manage.py makemigrations --empty myApp
  2. 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.