PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como executo SQL bruto em uma migração do django

Uma maneira:


A melhor maneira que encontrei para fazer isso é usando o RunSQL:

Migrations contém a classe RunSQL. Para fazer isso:
  1. ./manage.py makemigrations --empty myApp
  2. edite o arquivo de migração criado para incluir:

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

Como Nathaniel Knight mencionou, RunSQL também aceita um reverse_sql parâmetro para reverter a migração. Consulte os documentos para obter detalhes

Outra maneira


A maneira como resolvi meu problema inicialmente foi usando o post_migrate sinal para chamar um cursor para executar meu SQL bruto.

O que eu tive que adicionar ao meu aplicativo foi isso:

no __init__.py de myApp adicionar:
default_app_config = 'myApp.apps.MyAppConfig'

Crie um arquivo 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)

Novo arquivo 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.'

Agora em cada manage.py syncdb ou manage.py migrate esta função é chamada. Portanto, certifique-se de usar CREATE OR REPLACE e IF NOT EXISTS . Assim, ele pode lidar com funções existentes.