sql >> Databáze >  >> RDS >> PostgreSQL

Jak provedu raw SQL při migraci django

Jedna cesta:

Nejlepší způsob, jak to udělat, je použití RunSQL:

Migrace obsahuje třídu RunSQL. Postup:

  1. ./manage.py makemigrations --empty myApp
  2. upravte vytvořený soubor migrace tak, aby obsahoval:

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

Jak zmínil Nathaniel Knight, RunSQL také přijímá reverse_sql parametr pro zrušení migrace. Podrobnosti naleznete v dokumentaci

Jiný způsob

Způsob, jakým jsem svůj problém původně vyřešil, byl pomocí post_migrate signál pro volání kurzoru pro provedení mého nezpracovaného SQL.

Do své aplikace jsem musel přidat toto:

v __init__.py z myApp add:

default_app_config = 'myApp.apps.MyAppConfig'

Vytvořte soubor 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)

Nový soubor 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.'

Nyní na každém manage.py syncdb nebo manage.py migrate tato funkce se nazývá. Ujistěte se tedy, že používá CREATE OR REPLACE a IF NOT EXISTS . Zvládne tedy stávající funkce.



  1. Použití DBCC CLONEDATABASE a Query Store pro testování

  2. Příkazy SQLite

  3. Jak optimalizovat mysql dotaz získávání kategorií a podkategorií

  4. Proč hovor nefunguje? (codeigniter 3)