sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan udfører jeg rå SQL i en django-migrering

En vej:

Den bedste måde, jeg fandt på at gøre dette på, er at bruge RunSQL:

Migrationer indeholder klassen RunSQL. For at gøre dette:

  1. ./manage.py makemigrations --empty myApp
  2. rediger den oprettede migreringsfil, så den inkluderer:

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

Som Nathaniel Knight nævnte, RunSQL accepterer også en reverse_sql parameter for at vende migreringen. Se dokumenterne for detaljer

En anden måde

Den måde, jeg løste mit problem på, var ved at bruge post_migrate signal til at kalde en markør for at udføre min rå SQL.

Det, jeg skulle tilføje til min app, var dette:

i __init__.py af myApp tilføje:

default_app_config = 'myApp.apps.MyAppConfig'

Opret 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å hver manage.py syncdb eller manage.py migrate denne funktion kaldes. Så sørg for, at den bruger CREATE OR REPLACE og IF NOT EXISTS . Så den kan håndtere eksisterende funktioner.



  1. Udfør erklæring med genvej i MySQLWorkbench

  2. Rækkestørrelsen er for stor (> 8126) kan jeg bare ændre InnoDB til MyISAM

  3. sql hvordan man kombinerer tre forespørgsler fra to tabeller til én forespørgsel

  4. Brug ikke sp_depends i SQL Server (den er forældet)