Satu arah:
Cara terbaik yang saya temukan untuk melakukan ini adalah menggunakan RunSQL:
Migrasi berisi kelas RunSQL. Untuk melakukan ini:
./manage.py makemigrations --empty myApp
- edit file migrasi yang dibuat untuk menyertakan:
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Seperti yang disebutkan Nathaniel Knight, RunSQL
juga menerima reverse_sql
parameter untuk membalikkan migrasi. Lihat dokumen untuk detailnya
Cara lain
Cara saya memecahkan masalah saya awalnya menggunakan post_migrate
sinyal untuk memanggil kursor untuk mengeksekusi SQL mentah saya.
Yang harus saya tambahkan ke aplikasi saya adalah ini:
di __init__.py
dari myApp tambahkan:
default_app_config = 'myApp.apps.MyAppConfig'
Buat file 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)
File baru 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.'
Sekarang di setiap manage.py syncdb
atau manage.py migrate
fungsi ini disebut. Jadi pastikan menggunakan CREATE OR REPLACE
dan IF NOT EXISTS
. Sehingga dapat menangani fungsi yang ada.