当初、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はリストから次のルーターに移動するためです。 ルーターは次のメソッドを定義できます。
- db_for_read
- db_for_write
- allow_relation
- allow_syncdb
最初の2つのメソッドは明らかで、クエリが実行されている
データベースの名前を返します。
allow_relationメソッド
は 、リクエストの妥当性を制御するように設計されています。 Djangoでは、
データベース間に意図的に誤った関係を作成することはできません。 つまり、このメソッドを使用して(
ForeignKeyまたは
ManyToManyFieldの )異なる
データベースの 2つのデータ構造間の関係を作成しようとすると、Djangoは必要な確認を求めます。 また、最後のメソッド
allow_syncdbを使用
すると、特定のモデルを作成するデータベースを決定でき
ます 。
いつものように、
いくつかのデータベースを操作するためのDjangoドキュメントには、多くの実用的な例があります。 これらには、データベースルーターで一般的なパターンの適用を開始する方法を説明する例が含まれています。 複数のデータベースのサポートにより、多大なメリットがもたらされ、Djangoの範囲が大幅に拡大します。