複数データベースのサポート

当初、Djangoは1つのデータベース( DATABASE_ *設定グループなどが含まれるシステムの制限)のみで動作することを想定していました。 この間、いくつかのデータベースを操作する機能をサポートする必要性が明確に感じられました。 Google Summer of Codeでのバージョン1.2の作業の一環として、複数のデータベースのサポートがトランクに含まれました。 これらの技術革新に加えて、既存のデータベースインターフェースのいくつかの成功した拡張に加えて、多くの内部変更が関連付けられています。



複数のデータベースを操作するためのインターフェース

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ルーター

これらすべての方法を使用すると、複数のデータベースを使用するシステムを実装する機会が得られます。 マスター/スレーブレプリケーション、パーティショニング、シャーディングを含む。 ただし、これは必ずしも便利ではありません。 多くの場合、コードでusing()メソッドの呼び出しを使用する必要がありますが、これは再利用されたDjangoアプリケーションの原則と互換性がありません(これが、useオプションがMetaモデルクラスから削除された理由です)。 さらに、場合によっては、 QuerySetクラスが完全に定義されていません。 そのため、たとえば、 Userクラスのデータにアクセスするために、 my_obj.userメソッド暗黙的にQuerySetを作成しますが、 using()メソッドにはリクエストを送信する場所がありません。 これが、「 データベースルーター」の概念の出現の理由でした。 DBルーターは、実行する要求に関するすべての情報を受け取り、対処する必要があるデータベースを決定します。 ルーターは、設定ファイルでDATABASE_ROUTERSのリストとして定義されます。



  DATABASE_ROUTERS = [
      「path.to.AuthRouter」、
      「path.to.MasterSlaveRouter」、
  ] 


DATABASE_ROUTERSはリストによって設定されます。これは、ルーターがどの段階でもNoneを返すことができるため、Djangoはリストから次のルーターに移動するためです。 ルーターは次のメソッドを定義できます。

最初の2つのメソッドは明らかで、クエリが実行されているデータベースの名前を返します。 allow_relationメソッド 、リクエストの妥当性を制御するように設計されています。 Djangoでは、 データベース間に意図的に誤った関係を作成することはできません。 つまり、このメソッドを使用して( ForeignKeyまたはManyToManyFieldの )異なるデータベースの 2つのデータ構造間の関係を作成しようとすると、Djangoは必要な確認を求めます。 また、最後のメソッドallow_syncdbを使用すると、特定のモデルを作成するデータベースを決定できます



いつものように、 いくつかのデータベースを操作するためのDjangoドキュメントには、多くの実用的な例があります。 これらには、データベースルーターで一般的なパターンの適用を開始する方法を説明する例が含まれています。 複数のデータベースのサポートにより、多大なメリットがもたらされ、Djangoの範囲が大幅に拡大します。



All Articles