片道:
これを行うために私が見つけた最良の方法は、RunSQLを使用することです:
MigrationsにはRunSQLクラスが含まれています。これを行うには:
-
./manage.py makemigrations --empty myApp
- 作成した移行ファイルを編集して、以下を含めます。
operations = [
migrations.RunSQL('RAW SQL CODE')
]
Nathaniel Knightが述べたように、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
。そのため、既存の機能を処理できます。