Sono a conoscenza dell'oggetto cursore in Django. C'è un altro modo preferito per eseguire SQL raw nelle migrazioni? Voglio introdurre il partizionamento postgresql per una delle tabelle dei miei modelli. La logica della partizione è un insieme di funzioni e trigger che devono essere aggiunti al database sul setup che vorrei automatizzare.Come eseguire SQL raw in una migrazione django
risposta
Un modo:
Il modo migliore che ho trovato per farlo è usare EseguiSQL:
Migrazioni contiene la classe EseguiSQL. Per fare questo:
./manage.py makemigrations --empty myApp
- modificare il file migrazioni creato per includere:
operations = [ migrations.RunSQL('RAW SQL CODE') ]
Come detto Nathaniel Knight, RunSQL
accetta anche un parametro reverse_sql
per invertire la migrazione. See the docs for details
altro modo
Il modo risolto il problema inizialmente stava usando il segnale post_migrate
di chiamare un cursore per eseguire il mio SQL prime.
Quello che avevo da aggiungere alla mia applicazione è stata questa:
nel __init__.py
di myApp aggiungere:
default_app_config = 'myApp.apps.MyAppConfig'
Creare un file 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)
Nuovo file 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.'
Ora su ogni manage.py syncdb
o manage.py migrate
viene chiamata questa funzione. Quindi assicurati che usi CREATE OR REPLACE
e IF NOT EXISTS
. Quindi può gestire le funzioni esistenti.
C'è un modo per aggiungere backwards-migration per suctom sql? – DataGreed
Dovresti davvero spostare la nota su RunSQL in alto. È assolutamente il modo migliore per farlo ... –
@DataGreed Non sei sicuro di voler sapere, ma puoi passare una seconda stringa SQL da utilizzare come sql inverso. – LarrikJ