複数のデータベースを操作するためのインターフェース
Djangoで最も注目すべき変更点は、このようにデータベース設定を書く代わりに:DATABASE_ENGINE = "postgresql_psycopg2" DATABASE_NAME = "my_big_project" DATABASE_USER = "マリオ" DATABASE_PASSWORD = "princess_peach"
以下を書きます。
データベース= { 「デフォルト」:{ 「ENGINE」:「django.db.backends.postgresql_psycopg2」、 「NAME」:「my_big_project」、 「ユーザー」:「マリオ」、 「PASSWORD」:「princess_peach」、 }、 「資格情報」:{ 「エンジン」:「django.db.backends.oracle」、 「NAME」:「ユーザー」、 } }
最終的には、すべてのプロジェクトをこの形式に変換する必要がありますが、Djangoではバージョン1.4までは古い形式がサポートされます。 DATABASESディクショナリの重要な値を持つ唯一のキーは、 「デフォルト」 -「デフォルト」です。 データベースを使用している場合、 デフォルトのデータベースを定義する必要があります。
すべてのデータベースについてDjangoに伝えたので、Djangoにデータベースの使用方法を伝える方法を見つける必要があります。 この領域での最初のインターフェースの変更は、 using()メソッドです。 ()を使用すると、単一のパラメータであるデータベース名( データベース名はDATABASESディクショナリのキー)を取り、 QuerySetをこのデータベースにバインドします。 QuerySetクラスの他のツールと同様に、必要に応じて連鎖させることができます(たとえば、 order_by()メソッドは、クエリの繰り返し時に最初のクエリの結果を更新します)。 本質的に、これはデータの読み取り元を完全に制御する機能を提供します(そしてcreate() 、 delete()およびupdate()メソッドを巧妙に使用すると、レコードを制御することもできます)。
>>> User.objects.filter(username__startswith = "admin")。Using( "credentials")
QuerySetクラスのデータを操作するための新しいメソッドdelete()およびsave()は、 データベース名に再び渡されるusingを使用して、追加の引数を受け入れます 。
さらに、 Managersクラスの新しいメソッドdb_manager()が表示されます 。これは、 データベースの名前も取ります 。 その機能は、基本的にusing()メソッドに似ています。 主な違いはこれです: QuerySetを返す代わりに、新しいManagerを返します。 使用のシナリオにより、 QuerySetを返さないManagersクラスのメソッド(たとえば、 UserManagerクラスのcreate_user()など)と連鎖させることができます。
DBルーター
これらすべての方法を使用すると、複数のデータベースを使用するシステムを実装する機会が得られます。DATABASE_ROUTERS = [ 「path.to.AuthRouter」、 「path.to.MasterSlaveRouter」、 ]
DATABASE_ROUTERSはリストによって設定されます。これは、ルーターがどの段階でもNoneを返すことができるため、Djangoはリストから次のルーターに移動するためです。 ルーターは次のメソッドを定義できます。
- db_for_read
- db_for_write
- allow_relation
- allow_syncdb
いつものように、 いくつかのデータベースを操作するためのDjangoドキュメントには、多くの実用的な例があります。 これらには、データベースルーターで一般的なパターンの適用を開始する方法を説明する例が含まれています。 複数のデータベースのサポートにより、多大なメリットがもたらされ、Djangoの範囲が大幅に拡大します。