एक तरफ़ा:
मुझे ऐसा करने का सबसे अच्छा तरीका रनएसक्यूएल का उपयोग करना है:
माइग्रेशन में RunSQL वर्ग होता है। ऐसा करने के लिए:
./manage.py makemigrations --empty myApp
- बनाई गई माइग्रेशन फ़ाइल को शामिल करने के लिए संपादित करें:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
जैसा कि नथानिएल नाइट ने उल्लेख किया है, RunSQL
एक reverse_sql
भी स्वीकार करता है माइग्रेशन को उलटने के लिए पैरामीटर। विवरण के लिए दस्तावेज़ देखें
दूसरा तरीका
जिस तरह से मैंने शुरू में अपनी समस्या का समाधान किया वह 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
. तो यह मौजूदा कार्यों को संभाल सकता है।