django - 초기화 - python manage.py migrate 에러



어떻게 장고 마이 그 레이션에서 원시 SQL을 실행합니까 (1)

장고의 커서 객체에 대해 알고 있습니다. 마이그레이션시 원시 SQL을 실행하는 다른 방법이 있습니까? 내 모델 테이블 중 하나에 postgresql 파티셔닝을 소개하고자합니다. 파티션 논리는 자동화 할 설치 프로그램에서 데이터베이스에 추가해야하는 기능과 트리거의 집합입니다.


일방 통행:

이 작업을 수행하는 가장 좋은 방법은 RunSQL을 사용하는 것입니다.

Migrations에는 RunSQL 클래스가 포함되어 있습니다. 이것을하기 위해:

  1. ./manage.py makemigrations --empty myApp
  2. 생성 된 마이그레이션 파일을 편집하여 다음을 포함 시키십시오.

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

Nathaniel Knight가 언급했듯이 RunSQL 은 이전을 되돌리기위한 reverse_sql 매개 변수도 허용합니다. 자세한 내용은 문서를 참조하십시오.

또 다른 방법

내 문제를 처음에 해결하는 방법은 post_migrate 신호를 사용하여 원시 SQL을 실행하는 커서를 호출하는 것이 post_migrate .

내 앱에 추가해야하는 것은 다음과 같습니다.

myApp의 __init__.py 을 추가하십시오.

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 경우 사용하십시오. 따라서 기존 기능을 처리 할 수 ​​있습니다.





django-migrations