2016-05-05 2 views
1

新しいデータベースが初期化されたときやテストが実行される前に、カスタムスキーマ定義(関数、ビュー、タイプ、トリガなど)を適用したいときは何度もあります。 私はsyncdbの後にカスタムSQLを実行するようにDjangoに指示する最良の方法は何ですか?

from django.db.models.signals import post_syncdb 
from django.db import connection 

# Apply schema changes not defined by Django. Set a module-level 
# flag to guard against multiple invocations of syncdb_handler() 

def syncdb_handler(**kwargs): 
    if getattr(connection, 'syncdb_called', None): 
     return 
    connection.syncdb_called = True 
    cursor = connection.cursor() 
    cursor.execute(open('/path/to/schema.sql')).read()) 

post_syncdb.connect(syncdb_handler) 

は、ドキュメントは、このようなソリューションを提案していないように動作しないsettings.pyに以下の追加を、呼び起こさ。カスタムSQLをデータベース作成の一部として適用するための規則はありますか?

この例では、接続ハンドラが複数回呼び出され、グローバル変数を保持することは良い設計パターンのようには見えません。

+0

これを整理できましたか? – e4c5

+0

いいえ、私たちはDjango 1.4を使用しており、後のバージョンに移行することは非常に難しいと判明した大規模なアプリケーションを持っています。 – eradman

+0

おっと!私はあなたに1.4が今サポートされていないことを伝える必要はないと思います。 – e4c5

答えて

1

post_syncdbシグナルを使用することは、以前はやっていることが望ましい方法でした(このコードをsettings.pyに配置することはほとんどありませんでした)。

しかし、syncdbは使用されなくなりました。今度はデータベースが作成され、migrationsで修正されました。これにより、必要に応じてmigrations.RunSQLまたはmigrations.RunPythonを使用してデータベースをカスタマイズして変更することができます。

関連する問題