web-dev-qa-db-ja.com

Django移行でraw SQLを実行する方法

Djangoのカーソルオブジェクトを知っています。移行で生のSQLを実行する他の好ましい方法はありますか?モデルテーブルの1つにpostgresqlパーティション分割を導入したいと思います。パーティションロジックは、自動化したいセットアップでデータベースに追加する必要がある一連の関数とトリガーです。

22
David Schumann

一方通行:

これを行うために見つけた最良の方法は、RunSQLを使用することです。

MigrationsにはRunSQLクラスが含まれています。これをする:

  1. _./manage.py makemigrations --empty myApp_
  2. 作成した移行ファイルを編集して、次の内容を含めます。

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

Nathaniel Knightが述べたように、RunSQLは移行を元に戻すための_reverse_sql_パラメータも受け入れます。 詳細はドキュメントを参照してください

別の方法

最初に問題を解決した方法は、_post_migrate_信号を使用してカーソルを呼び出し、生のSQLを実行することでした。

私がアプリに追加しなければならないのはこれです:

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_を使用していることを確認してください。したがって、既存の関数を処理できます。

39
David Schumann

Django-migrate-sql-deuxhttps://pypi.org/project/Django-migrate-sql-deux/

この方法で、Djangoのモデルのように宣言的な方法でビュー、関数、トリガーなどのデータベースオブジェクトを管理できます。次に、変更をDjango migrations into makemigrationsに生成し、migrateを介して適用する必要があります。したがって、開発とデプロイのフローはほとんど同じです。

Djangoが生のSQL「モデル」用のこのシステムを持ち、makemigrationsおよびmigrateコマンドでDjango-migrate-sql-deux

0
Petr Přikryl