sql >> データベース >  >> RDS >> PostgreSQL

djangoの移行で生のSQLを実行するにはどうすればよいですか

    片道:

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

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

    1. ./manage.py makemigrations --empty myApp
    2. 作成した移行ファイルを編集して、以下を含めます。

    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 。そのため、既存の機能を処理できます。



    1. 選択クエリで2つのテーブルの同じフィールド名を区別するにはどうすればよいですか?

    2. PHP:PDOを使用してMySQLから画像を取得する

    3. ER_CON_COUNT_ERROR:ノードの接続エラーが多すぎます-mysql

    4. MySQLの列挙型はNOTNULLである必要がありますか?