¿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:
./manage.py makemigrations --empty myApp
- 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.