PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да изпълня необработен SQL в миграция на django

Еднопосочен:

Най-добрият начин, който открих, е да използвам RunSQL:

Миграциите съдържат класа RunSQL. За да направите това:

  1. ./manage.py makemigrations --empty myApp
  2. редактирайте създадения файл за миграции, за да включите:

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

Както Nathaniel Knight спомена, RunSQL също приема reverse_sql параметър за обръщане на миграцията. Вижте документите за подробности

Друг начин

Начинът, по който реших проблема си първоначално, беше с помощта на post_migrate сигнал за извикване на курсор за изпълнение на моя необработен SQL.

Това, което трябваше да добавя към приложението си, беше следното:

в __init__.py на myApp add:

default_app_config = 'myApp.apps.MyAppConfig'

Създайте файл 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)

Нов файл 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.'

Сега на всеки manage.py syncdb или manage.py migrate тази функция се нарича. Затова се уверете, че използва CREATE OR REPLACE и IF NOT EXISTS . Така че може да обработва съществуващи функции.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Рефакторни функции, така че да могат да се използват в CTE

  2. SQL подзаявки в ограничение за проверка

  3. Postgresql - Regex разделен csv ред с потенциални кавички

  4. Вземете IPAddr екземпляр от неговото json представяне

  5. Лош дизайн ли е да се използват масиви в база данни?