django postgresql database-partitioning django-migrations

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



postgresql database-partitioning (1)

De una sola mano:

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

Las migraciones contienen la clase RunSQL. Para hacer esto:

  1. ./manage.py makemigrations --empty myApp
  2. Edite el archivo de migraciones creado para incluir:

operations = [ migrations.RunSQL(''RAW SQL CODE'') ]

Como mencionó Nathaniel Knight, RunSQL también acepta un parámetro reverse_sql para revertir la migración. Consulte la documentación para más detalles.

De otra manera

La forma en que resolví mi problema inicialmente fue usando la señal post_migrate para llamar a un cursor para ejecutar mi SQL en bruto.

Lo que tuve que agregar a mi aplicación fue esto:

en el __init__.py de myApp agrega:

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 se llama a manage.py migrate esta función. Así que asegúrese de que use CREATE OR REPLACE y IF NOT EXISTS . Así que puede manejar las funciones existentes.

Soy consciente del objeto del cursor en Django. ¿Hay alguna otra forma preferida de ejecutar SQL en bruto en las migraciones? Quiero introducir la partición postgresql para una de mis tablas de modelos. La lógica de partición es un conjunto de funciones y activadores que deben agregarse a la base de datos en la configuración que me gustaría automatizar.