17

Мне известен объект курсора в Django. Есть ли другой предпочтительный способ выполнения сырого SQL при миграции? Я хочу ввести разбиение postgresql для одной из моих таблиц моделей. Логика раздела представляет собой набор функций и триггеров, которые необходимо добавить в базу данных при настройке, которую я хотел бы автоматизировать.Как выполнить необработанный SQL в миграции django

ответ

29

Один из способов:

Лучший способа я нашел, чтобы сделать это с помощью RunSQL:

Миграции содержит класс RunSQL. Для этого:

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

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

Как уже упоминалось Натаниэль Найт, RunSQL также принимает параметр reverse_sql для реверсирования миграции. See the docs for details

Другой способ

Как я решить мою проблему первоначально использовал post_migrate сигнал вызова курсор, чтобы выполнить мой сырой SQL.

То, что я должен был добавить в мое приложение было это:

в __init__.py из MYAPP добавить:

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. Таким образом, он может обрабатывать существующие функции.

+0

Есть ли способ добавить обратную миграцию для suctom sql? – DataGreed

+0

Вы действительно должны перенести заметку о RunSQL в начало. Это самый лучший способ сделать это ... –

+0

@DataGreed Не уверен, что вы все еще хотите знать, но вы можете передать вторую строку SQL, которая будет использоваться в качестве обратного sql. – LarrikJ

Смежные вопросы