sql >> Database >  >> RDS >> PostgreSQL

Hoe voer ik onbewerkte SQL uit in een django-migratie?

Enkele reis:

De beste manier die ik heb gevonden om dit te doen, is door RunSQL te gebruiken:

Migraties bevat de RunSQL-klasse. Om dit te doen:

  1. ./manage.py makemigrations --empty myApp
  2. bewerk het gemaakte migratiebestand met:

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

Zoals Nathaniel Knight al zei, RunSQL accepteert ook een reverse_sql parameter voor het terugdraaien van de migratie. Zie de documenten voor details

Een andere manier

De manier waarop ik mijn probleem aanvankelijk oploste, was het gebruik van de post_migrate signaal om een ​​cursor aan te roepen om mijn onbewerkte SQL uit te voeren.

Wat ik aan mijn app moest toevoegen was dit:

in de __init__.py van myApp toevoegen:

default_app_config = 'myApp.apps.MyAppConfig'

Maak een bestand 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)

Nieuw bestand 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 op elke manage.py syncdb of manage.py migrate deze functie wordt aangeroepen. Zorg er dus voor dat het CREATE OR REPLACE gebruikt en IF NOT EXISTS . Dus het kan bestaande functies aan.



  1. Oracle-datumformaatafbeelding eindigt voordat de volledige invoerreeks wordt geconverteerd

  2. MySql gebruiken MySQLMembershipProvider - autogenerateschema=true werkt niet?

  3. Alleen-lezen DB-verbindingen beheren op toepassingsniveau

  4. Multipliciteitsbeperking geschonden SQL Server 2008 - CodeFirst