- Django標準の
DATABASES
でDBを定義し、DATABASE_ROUTERS
でルーティングを定義したクラスを書けばほぼ行けそう。 - 3rd-Partyはレプリカ遅延のアプローチを提供しているので、使うならPJに合うものを選定・もしくは自前実装すること。
- 以下のドキュメントを参照のこと。読み取りのスケーリングに効果的な機能である。
公式ドキュメント: 複数のデータベース | Django ドキュメント | Django
- Django 1.4 documentation の頃には既にある機能。
- 公式の実装例はプライマリ/レプリカ構造のレプリケーション・ラグ(書き込みがレプリカに伝播するまでに時間がかかるために生じるクエリの不整合)を処理する内容を提供していない。
- また上記例はトランザクションとデータベース利用戦略の相互作用が考慮されていない。
- しかし考慮すべきはそのぐらいなので標準にミドルウェアやルーターを追加して書き換えることは可能
どちらも3〜4年ほどメンテされていないので、導入するなら対応内容や状況を見て行うこと
- Released: Apr 10, 2020
- Star: 349
- Fork: 65
- 特徴: デコレーターもしくは辞書で指定したviews単位でプライマリ/レプリカを指定できる
- メンテ状況
- 現在某PJで運用してるので実績があるが、4年ほどメンテされていない。
- テストコードがpytestで記述されているので、テストコードだけ修正すれば動きそう。
- Python3.12でも、Django5.0でもWarningもなくテストが通る
- pytest-django>=4.3.0だとテストがコケるが、4.2.0ならテストは通るので一旦スキップ
-
Released: Sep 23, 2021
-
Star: 305
-
Fork: 61
-
特徴: デコレーターでプライマリ/レプリカを指定できる。(viewsに縛られないかは要確認)
-
メンテ状況
- django_replicatedで代替として上げられているが、3年ほどメンテされていない。(別某PJで実績あり)
- Django4.2まではテストが通るPRを上げている人がいる。
- テストコードがdjango-noseなので、Python3.10以降だとテストコードが通らない...
- PinningReplicaRouterをtokibitoさんのプロジェクトでは使っているが、ほかは別にDjango標準の機能でできるのでいらない。
-
Django Packages : Reusable apps, sites and tools directory for Django で探しても特に他に定番は見つからず
- 独自でDjango Middlewareを作成して、APIリクエスト単位でルーティング設定。GETリクエストの場合はReplicaを参照させる
- DjangoのDATABASE_ROUTERS とMiddlewareを作成して実装する例。モデル単位で接続先を分ける例も説明されている。