PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie führe ich rohes SQL in einer Django-Migration aus

Eine Richtung:

Der beste Weg, den ich dafür gefunden habe, ist die Verwendung von RunSQL:

Migrationen enthält die RunSQL-Klasse. Dazu:

  1. ./manage.py makemigrations --empty myApp
  2. Bearbeiten Sie die erstellte Migrationsdatei so, dass sie Folgendes enthält:

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

Wie Nathaniel Knight erwähnte, RunSQL akzeptiert auch ein reverse_sql Parameter zum Rückgängigmachen der Migration. Einzelheiten finden Sie in der Dokumentation

Ein anderer Weg

Die Art und Weise, wie ich mein Problem ursprünglich gelöst habe, war die Verwendung von post_migrate Signal zum Aufrufen eines Cursors zum Ausführen meines Roh-SQL.

Was ich zu meiner App hinzufügen musste, war Folgendes:

in der __init__.py von myApp hinzufügen:

default_app_config = 'myApp.apps.MyAppConfig'

Erstellen Sie eine Datei 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)

Neue Datei 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.'

Jetzt auf jeder manage.py syncdb oder manage.py migrate Diese Funktion wird aufgerufen. Stellen Sie also sicher, dass es CREATE OR REPLACE verwendet und IF NOT EXISTS . Es kann also mit bestehenden Funktionen umgehen.