sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur kör jag rå SQL i en django-migrering

En väg:

Det bästa sättet jag hittade för att göra detta är att använda RunSQL:

Migrations innehåller klassen RunSQL. För att göra detta:

  1. ./manage.py makemigrations --empty myApp
  2. redigera den skapade migreringsfilen så att den inkluderar:

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

Som Nathaniel Knight nämnde, RunSQL accepterar även en reverse_sql parameter för att vända migreringen. Se dokumenten för mer information

Ett annat sätt

Sättet jag löste mitt problem från början var att använda post_migrate signal att anropa en markör för att köra min rå SQL.

Det jag var tvungen att lägga till i min app var detta:

i __init__.py av myApp lägg till:

default_app_config = 'myApp.apps.MyAppConfig'

Skapa en fil 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)

Ny fil 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.'

Nu på varje manage.py syncdb eller manage.py migrate denna funktion kallas. Så se till att den använder CREATE OR REPLACE och IF NOT EXISTS . Så den kan hantera befintliga funktioner.



  1. PDO::fetchAll vs. PDO::fetch in a loop

  2. Hämtar oracle XMLType lagrad som binär XML från en resultatuppsättning i Java

  3. Är det möjligt att bädda in en MySQL-databasserver i en Java-servlet?

  4. Effektiv hantering av dataförändringar