{"title":"複数のデータベース","version":"5.2","locale":"ja","docname":"topics/db/multi-db","url":"/ja/5.2/topics/db/multi-db/","canonical":"https://djangodocs.dev/ja/5.2/topics/db/multi-db/","summary":"ここでは、Djangoがサポートする複数データベースの扱いについて説明します。残りのDjangoのドキュメントの大部分は、あなたが一つのデータベース扱うことを前提として…","html":"<h1>複数のデータベース<a class=\"heading-anchor\" href=\"#multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>ここでは、Djangoがサポートする複数データベースの扱いについて説明します。残りのDjangoのドキュメントの大部分は、あなたが一つのデータベース扱うことを前提としています。複数のデータベースを使いたいなら、いくつかの追加ステップを踏む必要があります。</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">参考</p>\n<p>複数のデータベースを使用したテストに付いての情報は、<a class=\"reference internal\" href=\"/ja/5.2/topics/testing/tools/#testing-multi-db\"><span class=\"std std-ref\">マルチデータベースのサポート</span></a> を参照してください。</p>\n</aside>\n<section id=\"defining-your-databases\">\n<h2>データベースを定義する<a class=\"heading-anchor\" href=\"#defining-your-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django でデータベースを使う最初のステップは、利用するデータベースサーバーを Django に教えることです。これは、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> の設定で行います。この設定は、データベースへのエイリアスです。Django を通してデータベースを参照するためのデータベースエイリアスを、辞書にマッピングします。この辞書の設定の詳細は、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> ドキュメントで説明しています。</p>\n<p>データベースには、選択した任意のエイリアスを付けることができます。しかし、エイリアス <code class=\"docutils literal notranslate\">default</code> は特別な意味があります。Django は、他のデータベースが選択されていない場合、<code class=\"docutils literal notranslate\">default</code> というエイリアスを持つデータベースを使用します。</p>\n<p>以下に示すのは、2つのデータベース、すなわちデフォルトの PostgreSQL データベースと <code class=\"docutils literal notranslate\">users</code> という名前の MySQL データベースを定義した <code class=\"docutils literal notranslate\">settings.py</code> スニペットの例です。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>DATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;app_data&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.postgresql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;postgres_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;s3krit&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;users&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;user_data&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mysql_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;priv4te&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">default</code> データベースという概念がプロジェクトのコンテキストで意味をなさない場合、使用したいデータベースを注意深く常に指定する必要があります。Django は <code class=\"docutils literal notranslate\">default</code> データベースエントリーが定義されていることを要求しますが、使用しない場合はパラメータのディクショナリを空白のままにできます。これを行うには、使用している contrib とサードパーティを含むすべてのアプリのモデルで <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a> をセットアップしなければなりません。以下は、<code class=\"docutils literal notranslate\">default</code> エントリーを意図的に空のままにして、2つの default ではないデータベースを定義している <code class=\"docutils literal notranslate\">settings.py</code> スニペットの例です。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>DATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{},</span>\n    <span class=\"s2\">&quot;users&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;user_data&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mysql_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;superS3cret&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;customers&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;customer_data&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mysql_cust&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;veryPriv@ate&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> 設定で定義されていないデータベースへのアクセスを試みた場合、Django は <code class=\"docutils literal notranslate\">django.utils.connection.ConnectionDoesNotExist</code> 例外を発生されます。</p>\n</section>\n<section id=\"synchronizing-your-databases\">\n<span id=\"synchronizing-multiple-databases\"></span><h2>データベースを同期する<a class=\"heading-anchor\" href=\"#synchronizing-your-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> 管理コマンドは一度に一つのデータベースに対して動作します。デフォルトでは <code class=\"docutils literal notranslate\">default</code> データベース上で動作しますが、 <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#cmdoption-migrate-database\"><code class=\"xref std std-option docutils literal notranslate\">--database</code></a> オプションを指定することで、別のデータベースを同期させることができます。つまり、上記の最初の例ですべてのモデルをすべてのデータベースに同期させるには、次のように呼び出します:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ ./manage.py migrate\n$ ./manage.py migrate --database<span class=\"o\">=</span>users\n</code></pre></div>\n<p>すべてのアプリケーションを特定のデータベースに同期させたくない場合には、特定のモデルの利用を制限するポリシーを実装した <a class=\"reference internal\" href=\"#topics-db-multi-db-routing\"><span class=\"std std-ref\">データベース ルーター</span></a> を定義できます。</p>\n<p>上記の2番目の例のように、 <code class=\"docutils literal notranslate\">default</code> データベースを空のままにしている場合、 <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> を実行するときは毎回データベース名を指定する必要があります。データベース名を省略するとエラーになります。2番目の例では次のようになります:</p>\n<div class=\"code-block\" data-language=\"shell\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code>$ ./manage.py migrate --database<span class=\"o\">=</span>users\n$ ./manage.py migrate --database<span class=\"o\">=</span>customers\n</code></pre></div>\n<section id=\"using-other-management-commands\">\n<h3>他の管理コマンドを使用する<a class=\"heading-anchor\" href=\"#using-other-management-commands\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>データベースとやり取りする他のほとんどの <code class=\"docutils literal notranslate\">django-admin</code> コマンドは <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> と同じ方法で動作します ― これらは一度に一つのデータベース上でのみ動作し、使用するデータベースを制御するために <code class=\"docutils literal notranslate\">--database</code> を使用します。</p>\n<p>このルールの例外は <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> コマンドです。このコマンドは新しいマイグレーションを作成する前に、データベース内のマイグレーション履歴を検証して、既存のマイグレーションファイルの問題 (マイグレーションファイル自体の編集によって起こるものを含む) を検出します。デフォルトでは <code class=\"docutils literal notranslate\">default</code> データベースのみをチェックしますが、 <a class=\"reference internal\" href=\"#topics-db-multi-db-routing\"><span class=\"std std-ref\">routers</span></a> がインストールされている場合には <a class=\"reference internal\" href=\"#allow_migrate\" title=\"allow_migrate\"><code class=\"xref py py-meth docutils literal notranslate\">allow_migrate()</code></a> メソッドを参照します。</p>\n</section>\n</section>\n<section id=\"automatic-database-routing\">\n<span id=\"topics-db-multi-db-routing\"></span><h2>自動的なデータベースのルーティング<a class=\"heading-anchor\" href=\"#automatic-database-routing\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>複数のデータベースを使用する最も簡単な方法は、データベースのルーティングスキームを設定することです。デフォルトのルーティングスキームでは、オブジェクトは元のデータベースに ''くっついた'' まま保存されます (つまり、<code class=\"docutils literal notranslate\">foo</code> データベースから取得したオブジェクトは同じデータベースに保存されます)。デフォルトのルーティングスキームでは、データベースが指定されていない場合、すべてのクエリは <code class=\"docutils literal notranslate\">default</code> データベースにフォールバックします。</p>\n<p>デフォルトのルーティングスキームを有効にするために何もする必要はありません -- すべての Django プロジェクトで「箱から出してすぐに」使えます。しかし、もっと面白いデータベース割り当ての動作を実装したければ、独自の データベース ルーターを定義してインストールできます。</p>\n<section id=\"database-routers\">\n<h3>データベース ルーター<a class=\"heading-anchor\" href=\"#database-routers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>データベース ルーターは、以下の 4 つのメソッドを提供するクラスです:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"db_for_read\">\n<span class=\"sig-name descname\">db_for_read</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model</em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#db_for_read\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p><code class=\"docutils literal notranslate\">model</code> 型のオブジェクトの読み取り操作に使用するデータベースをサジェストします。</p>\n<p>データベース操作がデータベースを選択する際に役立つ追加情報を提供できる場合、それは <code class=\"docutils literal notranslate\">hints</code> 辞書で与えられます。有効なヒントの詳細は <a class=\"reference internal\" href=\"#topics-db-multi-db-hints\"><span class=\"std std-ref\">下記</span></a> を参照してください。</p>\n<p>サジェストがない場合は <code class=\"docutils literal notranslate\">None</code> を返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"db_for_write\">\n<span class=\"sig-name descname\">db_for_write</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model</em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#db_for_write\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Model型のオブジェクトの書き込みに使用するデータベースをサジェストします。</p>\n<p>データベース操作がデータベースを選択する際に役立つ追加情報を提供できる場合、それは <code class=\"docutils literal notranslate\">hints</code> 辞書で与えられます。有効なヒントの詳細は <a class=\"reference internal\" href=\"#topics-db-multi-db-hints\"><span class=\"std std-ref\">下記</span></a> を参照してください。</p>\n<p>サジェストがない場合は <code class=\"docutils literal notranslate\">None</code> を返します。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"allow_relation\">\n<span class=\"sig-name descname\">allow_relation</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">obj1</em>, <em class=\"sig-param\">obj2</em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#allow_relation\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>もし <code class=\"docutils literal notranslate\">obj1</code> と <code class=\"docutils literal notranslate\">obj2</code> の間のリレーションが許可されるべきであれば <code class=\"docutils literal notranslate\">True</code> を、禁止されるべきであれば <code class=\"docutils literal notranslate\">False</code> を、ルーターの意見がなければ <code class=\"docutils literal notranslate\">None</code> を返します。これは純粋に検証操作であり、外部キーや多対多の操作で、2つのオブジェクト間でリレーションが許可されるべきかどうかを判断するために使用されます。</p>\n<p>どのルーターも意見を持たない場合 (つまり、すべてのルーターが <code class=\"docutils literal notranslate\">None</code> を返す場合)、同じデータベース内のリレーションだけが許可されます。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"allow_migrate\">\n<span class=\"sig-name descname\">allow_migrate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">db</em>, <em class=\"sig-param\">app_label</em>, <em class=\"sig-param\">model_name<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"o\">**</span>hints</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#allow_migrate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>エイリアス <code class=\"docutils literal notranslate\">db</code> を持つデータベース上でマイグレーション操作を実行できるかどうかを判定します。操作を実行すべき場合は <code class=\"docutils literal notranslate\">True</code> を、実行すべきでない場合は <code class=\"docutils literal notranslate\">False</code> を、ルーターが意見を持たない場合は <code class=\"docutils literal notranslate\">None</code> を返します。</p>\n<p>位置引数 <code class=\"docutils literal notranslate\">app_label</code> はマイグレーションするアプリケーションのラベルです。</p>\n<p><code class=\"docutils literal notranslate\">model_name</code> はマイグレーションするモデルの <code class=\"docutils literal notranslate\">model._meta.model_name</code> (モデルの <code class=\"docutils literal notranslate\">__name__</code> を小文字にしたもの) に設定されます。この値は <a class=\"reference internal\" href=\"/ja/5.2/ref/migration-operations/#django.db.migrations.operations.RunPython\" title=\"django.db.migrations.operations.RunPython\"><code class=\"xref py py-class docutils literal notranslate\">RunPython</code></a> と <a class=\"reference internal\" href=\"/ja/5.2/ref/migration-operations/#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\">RunSQL</code></a> 操作ではヒントを使用しない限り <code class=\"docutils literal notranslate\">None</code> です。</p>\n<p><code class=\"docutils literal notranslate\">hints</code> は特定の操作でルーターに追加情報を伝えるために使われます。</p>\n<p><code class=\"docutils literal notranslate\">model_name</code> がセットされている場合、通常 <code class=\"docutils literal notranslate\">hints</code> には <code class=\"docutils literal notranslate\">'model'</code> というキーの下にモデルクラスが含まれます。これは <a class=\"reference internal\" href=\"/ja/5.2/topics/migrations/#historical-models\"><span class=\"std std-ref\">履歴上のモデル</span></a> であり、カスタム属性、メソッド、マネージャを持たないことに注意してください。 <code class=\"docutils literal notranslate\">_meta</code> にのみ依存する必要があります。</p>\n<p>この方法は、指定されたデータベース上のモデルの可用性を判断するためにも使用できます。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> は常にモデルの変更に対してマイグレーションを作成しますが、 <code class=\"docutils literal notranslate\">allow_migrate()</code> が <code class=\"docutils literal notranslate\">False</code> を返した場合、 <code class=\"docutils literal notranslate\">db</code> で <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> を実行すると、 <code class=\"docutils literal notranslate\">model_name</code> に対するマイグレーション操作はすべて警告なしにスキップされます。マイグレーションしているモデルに対して <code class=\"docutils literal notranslate\">allow_migrate()</code> の動作を変更すると、外部キーが壊れたり、テーブルが増えたり、テーブルがなくなったりする可能性があります。 <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-makemigrations\"><code class=\"xref std std-djadmin docutils literal notranslate\">makemigrations</code></a> がマイグレーション履歴を確認するとき、マイグレーションが許可されていないデータベースはスキップされます。</p>\n</dd></dl>\n\n<p>ルーターはこれらのメソッドを <em>全て</em> 提供する必要はありません -- 1 つ以上省略してもかまいません。もしメソッドの1つが省略された場合、 Django は関連するチェックを行う際にそのルーターをスキップします。</p>\n<section id=\"hints\">\n<span id=\"topics-db-multi-db-hints\"></span><h4>ヒント<a class=\"heading-anchor\" href=\"#hints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>データベースルーターが受け取ったヒントは、与えられたリクエストをどのデータベースが受け取るべきかを決定するために使うことができます。</p>\n<p>現在のところ、提供される唯一のヒントは <code class=\"docutils literal notranslate\">instance</code> で、現在進行中の読み取りまたは書き込み操作に関連するオブジェクトのインスタンスです。これは保存されるインスタンスかもしれませんし、多対多の関係で追加されるインスタンスかもしれません。場合によっては、インスタンスヒントは全く提供されません。ルーターはインスタンスヒントの存在をチェックし、そのヒントを使用してルーティング動作を変更すべきかどうかを決定します。</p>\n</section>\n</section>\n<section id=\"using-routers\">\n<h3>ルーターを使用する<a class=\"heading-anchor\" href=\"#using-routers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>データベースルーターは <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a> 設定を使ってインストールします。この設定はクラス名のリストを定義し、それぞれがベースルーター (<code class=\"docutils literal notranslate\">django.db.router</code>) が使用するルーターを指定します。</p>\n<p>ベースルーターは Django のデータベース操作で、データベースの使用量を割り当てるために使われます。クエリがどのデータベースを使うか知る必要があれば常に、ベースルーターを呼び出し、 モデルとヒント (もしあれば) を提供します。ベースルーターは、データベースのサジェストを返すルーターが現れるまで、順番に各ルータークラスを試します。ヒントを返すルーターがない場合、ベースルーターはヒントインスタンスの <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model._state\" title=\"django.db.models.Model._state\"><code class=\"xref py py-attr docutils literal notranslate\">instance._state.db</code></a> を試します。ヒントインスタンスが提供されなかった場合、または <a class=\"reference internal\" href=\"/ja/5.2/ref/models/instances/#django.db.models.Model._state\" title=\"django.db.models.Model._state\"><code class=\"xref py py-attr docutils literal notranslate\">instance._state.db</code></a> が <code class=\"docutils literal notranslate\">None</code> の場合、ベースルーターは <code class=\"docutils literal notranslate\">default</code> データベースを割り当てます。</p>\n</section>\n<section id=\"an-example\">\n<h3>例<a class=\"heading-anchor\" href=\"#an-example\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"admonition-example-purposes-only admonition\" role=\"note\">\n<p class=\"admonition-title\">例としてのみ使用してください！</p>\n<p>この例は、ルーターのインフラストラクチャを使用してデータベースの使用状況を変更する方法のデモを示すことだけを目的としています。ルーターの使用方法を紹介するために、いくつかの複雑な問題を意図的に無視しています。</p>\n<p>この例は、<code class=\"docutils literal notranslate\">myapp</code> 内のモデルのいずれかに <code class=\"docutils literal notranslate\">other</code> データベースの外部にあるモデルとのリレーションが含まれている場合には機能しません。<a class=\"reference internal\" href=\"#no-cross-database-relations\"><span class=\"std std-ref\">クロスデータベース リレーション</span></a> を使うと、現時点では Django が処理できない参照整合性の問題が発生します。</p>\n<p>プライマリ/レプリカ（一部のデータベースではマスター/スレーブと呼ばれる）構成も欠陥があります。レプリケーション・ラグ（書き込みがレプリカに伝搬するまでに時間がかかるために発生するクエリの不整合）を処理するソリューションを提供していません。また、トランザクションとデータベース利用戦略との相互作用も考慮されていません。</p>\n</aside>\n<p>では、実際にはどうなのでしょうか？別のサンプル構成を考えてみましょう。1つは <code class=\"docutils literal notranslate\">auth</code> アプリケーション用で、他のアプリケーションはプライマリ/レプリカのセットアップを使用し、2つのリードレプリカを使用します。これらのデータベースを指定する設定は以下の通りです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>DATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{},</span>\n    <span class=\"s2\">&quot;auth_db&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;auth_db_name&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mysql_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;swordfish&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;primary&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;primary_name&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mysql_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;spam&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;replica1&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;replica1_name&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mysql_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;eggs&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n    <span class=\"s2\">&quot;replica2&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;replica2_name&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mysql_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;bacon&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>次に、ルーティングを処理する必要があります。まず、 <code class=\"docutils literal notranslate\">auth</code> と <code class=\"docutils literal notranslate\">contenttypes</code> アプリのクエリを <code class=\"docutils literal notranslate\">auth_db</code> に送信するルーターが必要です (<code class=\"docutils literal notranslate\">auth</code> モデルは <code class=\"docutils literal notranslate\">ContentType</code> にリンクされているので、同じデータベースに格納されている必要があります):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">AuthRouter</span><span class=\"p\">:</span>\n    <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    A router to control all database operations on models in the</span>\n<span class=\"sd\">    auth and contenttypes applications.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    route_app_labels <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;auth&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;contenttypes&quot;</span><span class=\"p\">}</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Attempts to read auth and contenttypes models go to auth_db.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> model<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>route_app_labels<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;auth_db&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Attempts to write auth and contenttypes models go to auth_db.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> model<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>route_app_labels<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"s2\">&quot;auth_db&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">allow_relation</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj1<span class=\"p\">,</span> obj2<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Allow relations if a model in the auth or contenttypes apps is</span>\n<span class=\"sd\">        involved.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> <span class=\"p\">(</span>\n            obj1<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>route_app_labels\n            <span class=\"ow\">or</span> obj2<span class=\"o\">.</span>_meta<span class=\"o\">.</span>app_label <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>route_app_labels\n        <span class=\"p\">):</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db<span class=\"p\">,</span> app_label<span class=\"p\">,</span> model_name<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Make sure the auth and contenttypes apps only appear in the</span>\n<span class=\"sd\">        &#39;auth_db&#39; database.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">if</span> app_label <span class=\"ow\">in</span> <span class=\"bp\">self</span><span class=\"o\">.</span>route_app_labels<span class=\"p\">:</span>\n            <span class=\"k\">return</span> db <span class=\"o\">==</span> <span class=\"s2\">&quot;auth_db&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n</code></pre></div>\n<p>また、他のすべてのアプリをプライマリ/レプリカ構成に送り、ランダムにレプリカを選んで読み込むルーターも必要です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span> <span class=\"nn\">random</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PrimaryReplicaRouter</span><span class=\"p\">:</span>\n    <span class=\"k\">def</span> <span class=\"nf\">db_for_read</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Reads go to a randomly-chosen replica.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> random<span class=\"o\">.</span>choice<span class=\"p\">([</span><span class=\"s2\">&quot;replica1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;replica2&quot;</span><span class=\"p\">])</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">db_for_write</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> model<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Writes always go to primary.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> <span class=\"s2\">&quot;primary&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">allow_relation</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> obj1<span class=\"p\">,</span> obj2<span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Relations between objects are allowed if both objects are</span>\n<span class=\"sd\">        in the primary/replica pool.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        db_set <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;primary&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;replica1&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;replica2&quot;</span><span class=\"p\">}</span>\n        <span class=\"k\">if</span> obj1<span class=\"o\">.</span>_state<span class=\"o\">.</span>db <span class=\"ow\">in</span> db_set <span class=\"ow\">and</span> obj2<span class=\"o\">.</span>_state<span class=\"o\">.</span>db <span class=\"ow\">in</span> db_set<span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"kc\">True</span>\n        <span class=\"k\">return</span> <span class=\"kc\">None</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">allow_migrate</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db<span class=\"p\">,</span> app_label<span class=\"p\">,</span> model_name<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">,</span> <span class=\"o\">**</span>hints<span class=\"p\">):</span>\n        <span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        All non-auth models end up in this pool.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n</code></pre></div>\n<p>最後に、設定ファイルに以下を追加します (<code class=\"docutils literal notranslate\">path.to.</code> はルーターが定義されているモジュールの実際のPythonパスで置き換えてください):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>DATABASE_ROUTERS <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"s2\">&quot;path.to.AuthRouter&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;path.to.PrimaryReplicaRouter&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>ルーターが処理される順番は重要です。ルーターは <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a> 設定にリストされている順番にクエリされます。この例では、 <code class=\"docutils literal notranslate\">AuthRouter</code> が <code class=\"docutils literal notranslate\">PrimaryReplicaRouter</code> よりも先に処理され、その結果、 <code class=\"docutils literal notranslate\">auth</code> のモデルに関する決定が他の決定よりも先に処理されます。もし <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE_ROUTERS\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE_ROUTERS</code></a> 設定が2つのルーターを他の順番でリストしていた場合、 <code class=\"docutils literal notranslate\">PrimaryReplicaRouter.allow_migrate()</code> が最初に処理されます。PrimaryReplicaRouter実装のキャッチオール特性により、すべてのデータベースですべてのモデルが利用可能になります。</p>\n<p>このセットアップをインストールし、 <a class=\"reference internal\" href=\"#synchronizing-multiple-databases\"><span class=\"std std-ref\">データベースを同期する</span></a> に従って全てのデータベースをマイグレーションした状態で、Django のコードを実行してみましょう:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This retrieval will be performed on the &#39;auth_db&#39; database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>fred <span class=\"o\">=</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>username<span class=\"o\">=</span><span class=\"s2\">&quot;fred&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>fred<span class=\"o\">.</span>first_name <span class=\"o\">=</span> <span class=\"s2\">&quot;Frederick&quot;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This save will also be directed to &#39;auth_db&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>fred<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># These retrieval will be randomly allocated to a replica database</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>dna <span class=\"o\">=</span> Person<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Douglas Adams&quot;</span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># A new object has no database allocation when created</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>mh <span class=\"o\">=</span> Book<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Mostly Harmless&quot;</span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This assignment will consult the router, and set mh onto</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># the same database as the author object</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>mh<span class=\"o\">.</span>author <span class=\"o\">=</span> dna\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This save will force the &#39;mh&#39; instance onto the primary database...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>mh<span class=\"o\">.</span>save<span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># ... but if we re-retrieve the object, it will come back on a replica</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>mh <span class=\"o\">=</span> Book<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>title<span class=\"o\">=</span><span class=\"s2\">&quot;Mostly Harmless&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>この例では <code class=\"docutils literal notranslate\">auth</code> アプリのモデルとのやりとりを処理するルーターと、その他のアプリとのやりとりを処理するルーターを定義しています。もし <code class=\"docutils literal notranslate\">default</code> データベースを空のままにしていて、他に指定されていないすべてのアプリを処理するためのデータベースルーターを定義したくない場合は、マイグレーションする前に <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> にあるすべてのアプリの名前をルーターで処理する必要があります。1つのデータベースにまとめなければならないcontribアプリについては <a class=\"reference internal\" href=\"#contrib-app-multiple-databases\"><span class=\"std std-ref\">contribアプリの振る舞い</span></a> を参照してください。</p>\n</section>\n</section>\n<section id=\"manually-selecting-a-database\">\n<h2>データベースを手動で選択する<a class=\"heading-anchor\" href=\"#manually-selecting-a-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は、コード中でデータベースの利用を完全に制御できる API も提供し ています。手動で指定したデータベースの割り当てが、データベースルーターが割り当てたデー タベースよりも優先されます。</p>\n<section id=\"manually-selecting-a-database-for-a-queryset\">\n<h3><code class=\"docutils literal notranslate\">QuerySet</code> のためのデータベースを手動で選択する<a class=\"heading-anchor\" href=\"#manually-selecting-a-database-for-a-queryset\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><code class=\"docutils literal notranslate\">QuerySet</code> の &quot;チェーン&quot; のどの時点でも、 <code class=\"docutils literal notranslate\">QuerySet</code> のデータベースを選択できます。指定したデータベースを使用する別の <code class=\"docutils literal notranslate\">QuerySet</code> を取得するには、 <code class=\"docutils literal notranslate\">QuerySet</code> の <code class=\"docutils literal notranslate\">using()</code> を呼び出します。</p>\n<p><code class=\"docutils literal notranslate\">using()</code> は引数を1つ取り、クエリを実行したいデータベースのエイリアスを指定します。例えば次のようにします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This will run on the &#39;default&#39; database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>all<span class=\"p\">()</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># So will this.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;default&quot;</span><span class=\"p\">)</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># This will run on the &#39;other&#39; database.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;other&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"selecting-a-database-for-save\">\n<h3><code class=\"docutils literal notranslate\">save()</code> のためのデータベースを選択する<a class=\"heading-anchor\" href=\"#selecting-a-database-for-save\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>データを保存するデータベースを指定するには <code class=\"docutils literal notranslate\">Model.save()</code> に <code class=\"docutils literal notranslate\">using</code> キーワードを使用します。</p>\n<p>例えば、 <code class=\"docutils literal notranslate\">legacy_users</code> データベースにオブジェクトを保存するには、次のようにします:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>my_object<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;legacy_users&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>もし <code class=\"docutils literal notranslate\">using</code> を指定しなければ、 <code class=\"docutils literal notranslate\">save()</code> メソッドはルーターが割り当てたデフォルトのデータベースに保存します。</p>\n<section id=\"moving-an-object-from-one-database-to-another\">\n<h4>オブジェクトを1つのデータベースからもう1つのデータベースに移動する<a class=\"heading-anchor\" href=\"#moving-an-object-from-one-database-to-another\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>あるデータベースにインスタンスを保存した場合、インスタンスを新しいデータベースにマイグレーションする方法として <code class=\"docutils literal notranslate\">save(using=...)</code> を使いたくなるかもしれません。しかし、適切な手順を踏まないと、これは予期せぬ結果を招く可能性があります。</p>\n<p>以下の例を考えてみてください。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Fred&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;first&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># (statement 1)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;second&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># (statement 2)</span>\n</code></pre></div>\n<p>statement 1 では、新しい <code class=\"docutils literal notranslate\">Person</code> オブジェクトが <code class=\"docutils literal notranslate\">first</code> データベースに保存されます。この時、 <code class=\"docutils literal notranslate\">p</code> には主キーがないので、 Django は SQL の <code class=\"docutils literal notranslate\">INSERT</code> 文を発行します。これにより主キーが作成され、 Django はその主キーを <code class=\"docutils literal notranslate\">p</code> に割り当てます。</p>\n<p>statement 2 で保存が行われるとき、 <code class=\"docutils literal notranslate\">p</code> はすでに主キーの値を持っていて、 Django は新しいデータベースでその主キーを使おうとします。もし主キーの値が <code class=\"docutils literal notranslate\">second</code> のデータベースで使われていなければ、何の問題もありません -- オブジェクトは新しいデータベースにコピーされます。</p>\n<p>しかし、 <code class=\"docutils literal notranslate\">p</code> の主キーがすでに <code class=\"docutils literal notranslate\">second</code> データベースで使用されている場合は、 <code class=\"docutils literal notranslate\">p</code> が保存されたときに <code class=\"docutils literal notranslate\">second</code> データベースの既存のオブジェクトが上書きされます。</p>\n<p>これを回避するには2つの方法があります。1つ目の方法は、インスタンスの主キーをクリアすることです。オブジェクトに主キーがない場合、 Django はそのオブジェクトを新しいオブジェクトとして扱い、 <code class=\"docutils literal notranslate\">second</code> データベースのデータが失われるのを防ぎます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Fred&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;first&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>pk <span class=\"o\">=</span> <span class=\"kc\">None</span>  <span class=\"c1\"># Clear the primary key.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;second&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># Write a completely new object.</span>\n</code></pre></div>\n<p>2 つ目のオプションは、 <code class=\"docutils literal notranslate\">save()</code> に <code class=\"docutils literal notranslate\">force_insert</code> オプションをつけて、 Django が SQL の <code class=\"docutils literal notranslate\">INSERT</code> を行うようにすることです:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>p <span class=\"o\">=</span> Person<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Fred&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;first&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>p<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;second&quot;</span><span class=\"p\">,</span> force_insert<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これにより、 <code class=\"docutils literal notranslate\">Fred</code> という人物は両方のデータベースで同じ主キーを持つことになります。もしその主キーがすでに <code class=\"docutils literal notranslate\">second</code> データベースで使用されている場合、保存しようとするとエラーが発生します。</p>\n</section>\n</section>\n<section id=\"selecting-a-database-to-delete-from\">\n<h3>削除が行われるデータベースを選択する<a class=\"heading-anchor\" href=\"#selecting-a-database-to-delete-from\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルトでは、既存のオブジェクトを削除する呼び出しは、最初にオブジェクトを取得するために使用したのと同じデータベース上で実行されます。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>u <span class=\"o\">=</span> User<span class=\"o\">.</span>objects<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"s2\">&quot;legacy_users&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">(</span>username<span class=\"o\">=</span><span class=\"s2\">&quot;fred&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>u<span class=\"o\">.</span>delete<span class=\"p\">()</span>  <span class=\"c1\"># will delete from the `legacy_users` database</span>\n</code></pre></div>\n<p>モデルを削除するデータベースを指定するには、<code class=\"docutils literal notranslate\">using</code> キーワード引数を <code class=\"docutils literal notranslate\">Model.delete()</code> メソッドに渡します。この引数は、<code class=\"docutils literal notranslate\">save()</code> の <code class=\"docutils literal notranslate\">using</code> キーワード引数と同じように機能します。</p>\n<p>例えば、あるユーザーを <code class=\"docutils literal notranslate\">legacy_users</code> データベースから <code class=\"docutils literal notranslate\">new_users</code> データベースにマイグレーションする場合、以下のコマンドを使用します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>user_obj<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;new_users&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>user_obj<span class=\"o\">.</span>delete<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"s2\">&quot;legacy_users&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"using-managers-with-multiple-databases\">\n<h3>複数のデータベースでマネージャを使う<a class=\"heading-anchor\" href=\"#using-managers-with-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルト以外のデータベースにマネージャがアクセスできるようにするには、マネージャの <code class=\"docutils literal notranslate\">db_manager()</code> メソッドを使用します。</p>\n<p>例えば、データベースにアクセスするカスタムマネージャメソッド <code class=\"docutils literal notranslate\">User.objects.create_user()</code> があるとします。 <code class=\"docutils literal notranslate\">create_user()</code> はマネージャメソッドであり、 <code class=\"docutils literal notranslate\">QuerySet</code> メソッドではないので、 <code class=\"docutils literal notranslate\">User.objects.using('new_users').create_user()</code> は実行できません。 (<code class=\"docutils literal notranslate\">create_user()</code> メソッドはマネージャである <code class=\"docutils literal notranslate\">User.objects</code> でのみ使用可能で、マネージャから派生した <code class=\"docutils literal notranslate\">QuerySet</code> オブジェクトでは使用できません)。解決策は、次のように <code class=\"docutils literal notranslate\">db_manager()</code> を使うことです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>User<span class=\"o\">.</span>objects<span class=\"o\">.</span>db_manager<span class=\"p\">(</span><span class=\"s2\">&quot;new_users&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>create_user<span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">db_manager()</code> は指定したデータベースに結び付けられたマネージャのコピーを返します。</p>\n<section id=\"using-get-queryset-with-multiple-databases\">\n<h4>複数のデータベースで <code class=\"docutils literal notranslate\">get_queryset()</code> を使う<a class=\"heading-anchor\" href=\"#using-get-queryset-with-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>マネージャ上で <code class=\"docutils literal notranslate\">get_queryset()</code> をオーバーライドする場合は、親メソッドを呼び出す (<code class=\"docutils literal notranslate\">super()</code> を使用する) か、マネージャの <code class=\"docutils literal notranslate\">_db</code> 属性 (使用するデータベースの名前を含む文字列) を適切に処理するようにしてください。</p>\n<p>例えば、カスタム <code class=\"docutils literal notranslate\">QuerySet</code> クラスを <code class=\"docutils literal notranslate\">get_queryset</code> メソッドから返したい場合は、このようにします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MyManager</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Manager<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        qs <span class=\"o\">=</span> CustomQuerySet<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>model<span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"bp\">self</span><span class=\"o\">.</span>_db <span class=\"ow\">is</span> <span class=\"ow\">not</span> <span class=\"kc\">None</span><span class=\"p\">:</span>\n            qs <span class=\"o\">=</span> qs<span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>_db<span class=\"p\">)</span>\n        <span class=\"k\">return</span> qs\n</code></pre></div>\n</section>\n</section>\n</section>\n<section id=\"exposing-multiple-databases-in-django-s-admin-interface\">\n<h2>Django の管理インタフェースで複数のデータベースを公開する<a class=\"heading-anchor\" href=\"#exposing-multiple-databases-in-django-s-admin-interface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django の admin は複数のデータベースを明示的にサポートしていません。ルーターチェーンで指定したデータベース以外のデータベース上のモデルに対して admin インタフェースを提供したい場合は、 admin が特定のデータベースをコンテンツに使うように指示するカスタム <a class=\"reference internal\" href=\"/ja/5.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> クラスを書く必要があります。</p>\n<p><code class=\"docutils literal notranslate\">ModelAdmin</code> オブジェクトには、複数のデータベースのサポートのためのカスタマイズが必要な以下のメソッドがあります:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MultiDBModelAdmin</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">):</span>\n    <span class=\"c1\"># A handy constant for the name of the alternate database.</span>\n    using <span class=\"o\">=</span> <span class=\"s2\">&quot;other&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">save_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"p\">,</span> form<span class=\"p\">,</span> change<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to save objects to the &#39;other&#39; database.</span>\n        obj<span class=\"o\">.</span>save<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">delete_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> obj<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to delete objects from the &#39;other&#39; database</span>\n        obj<span class=\"o\">.</span>delete<span class=\"p\">(</span>using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to look for objects on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_queryset<span class=\"p\">(</span>request<span class=\"p\">)</span><span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ForeignKey widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>formfield_for_foreignkey<span class=\"p\">(</span>\n            db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs\n        <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ManyToMany widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>formfield_for_manytomany<span class=\"p\">(</span>\n            db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>ここで示した実装はマルチデータベース戦略を実装したもので、指定されたタイプのオブジェクトはすべて特定のデータベースに保存されます (例えば、すべての <code class=\"docutils literal notranslate\">User</code> オブジェクトは <code class=\"docutils literal notranslate\">other</code> データベースに保存されます)。複数のデータベースをより複雑に使用する場合は、 <code class=\"docutils literal notranslate\">ModelAdmin</code> にその戦略を反映させる必要があります。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/contrib/admin/#django.contrib.admin.InlineModelAdmin\" title=\"django.contrib.admin.InlineModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">InlineModelAdmin</code></a> オブジェクトも同じように扱うことができます。これらのオブジェクトには3つのカスタマイズされたメソッドが必要です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span> <span class=\"nc\">MultiDBTabularInline</span><span class=\"p\">(</span>admin<span class=\"o\">.</span>TabularInline<span class=\"p\">):</span>\n    using <span class=\"o\">=</span> <span class=\"s2\">&quot;other&quot;</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">get_queryset</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to look for inline objects on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>get_queryset<span class=\"p\">(</span>request<span class=\"p\">)</span><span class=\"o\">.</span>using<span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_foreignkey</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ForeignKey widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>formfield_for_foreignkey<span class=\"p\">(</span>\n            db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs\n        <span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">formfield_for_manytomany</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># Tell Django to populate ManyToMany widgets using a query</span>\n        <span class=\"c1\"># on the &#39;other&#39; database.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>formfield_for_manytomany<span class=\"p\">(</span>\n            db_field<span class=\"p\">,</span> request<span class=\"p\">,</span> using<span class=\"o\">=</span><span class=\"bp\">self</span><span class=\"o\">.</span>using<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs\n        <span class=\"p\">)</span>\n</code></pre></div>\n<p>モデル管理定義を書いたら、任意の <code class=\"docutils literal notranslate\">Admin</code> インスタンスに登録できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">myapp.models</span> <span class=\"kn\">import</span> Author<span class=\"p\">,</span> Book<span class=\"p\">,</span> Publisher\n\n<span class=\"c1\"># Import our custom ModelAdmin and TabularInline from where they&#39;re defined.</span>\n<span class=\"kn\">from</span> <span class=\"nn\">myproject.admin</span> <span class=\"kn\">import</span> MultiDBModelAdmin<span class=\"p\">,</span> MultiDBTabularInline\n\n\n<span class=\"c1\"># Specialize the multi-db admin objects for use with specific models.</span>\n<span class=\"k\">class</span> <span class=\"nc\">BookInline</span><span class=\"p\">(</span>MultiDBTabularInline<span class=\"p\">):</span>\n    model <span class=\"o\">=</span> Book\n\n\n<span class=\"k\">class</span> <span class=\"nc\">PublisherAdmin</span><span class=\"p\">(</span>MultiDBModelAdmin<span class=\"p\">):</span>\n    inlines <span class=\"o\">=</span> <span class=\"p\">[</span>BookInline<span class=\"p\">]</span>\n\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Author<span class=\"p\">,</span> MultiDBModelAdmin<span class=\"p\">)</span>\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>Publisher<span class=\"p\">,</span> PublisherAdmin<span class=\"p\">)</span>\n\nothersite <span class=\"o\">=</span> admin<span class=\"o\">.</span>AdminSite<span class=\"p\">(</span><span class=\"s2\">&quot;othersite&quot;</span><span class=\"p\">)</span>\nothersite<span class=\"o\">.</span>register<span class=\"p\">(</span>Publisher<span class=\"p\">,</span> MultiDBModelAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>この例では2つの管理サイトを設定しています。最初のサイトでは <code class=\"docutils literal notranslate\">Author</code> と <code class=\"docutils literal notranslate\">Publisher</code> オブジェクトが公開され、 <code class=\"docutils literal notranslate\">Publisher</code> オブジェクトにはその出版社が出版した書籍を示すインラインが表形式で表示されます。2番目のサイトでは、インラインを使わずに出版社だけを公開しています。</p>\n</section>\n<section id=\"using-raw-cursors-with-multiple-databases\">\n<h2>複数のデータベースで生のカーソルを使う<a class=\"heading-anchor\" href=\"#using-raw-cursors-with-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>複数のデータベースを使用している場合、 <code class=\"docutils literal notranslate\">django.db.connections</code> を使用することで、特定のデータベースのコネクション (とカーソル) を取得できます。 <code class=\"docutils literal notranslate\">django.db.connections</code> は辞書のようなオブジェクトで、次のように、エイリアスを使って個別の接続を取得できます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> connections\n\n<span class=\"k\">with</span> connections<span class=\"p\">[</span><span class=\"s2\">&quot;my_db_alias&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span>cursor<span class=\"p\">()</span> <span class=\"k\">as</span> cursor<span class=\"p\">:</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n</section>\n<section id=\"limitations-of-multiple-databases\">\n<h2>複数データベースの制約<a class=\"heading-anchor\" href=\"#limitations-of-multiple-databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"cross-database-relations\">\n<span id=\"no-cross-database-relations\"></span><h3>データベースをまたぐリレーション<a class=\"heading-anchor\" href=\"#cross-database-relations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Djangoは現在、複数のデータベースにまたがる外部キーまたは多対多の関係をサポートしていません。もしモデルを異なるデータベースに分割するためにルーターを使用している場合、それらのモデルによって定義される外部キーおよび多対多の関係は、単一のデータベース内部に限定されなければなりません。</p>\n<p>これは参照整合性のためです。2つのオブジェクト間のリレーションシップを維持するためには、Djangoはリレーション先オブジェクトの主キーが有効であることを知る必要があります。主キーが別のデータベースに格納されている場合、主キーが有効かどうかを判断するのは容易ではありません。</p>\n<p>Postgres、SQLite、Oracle、MySQLをInnoDBで使用している場合、これはデータベースの整合性レベルで強制されます。データベースレベルのキー制約は、検証できないリレーションの作成を防ぎます。</p>\n<p>しかし、MySQL で MyISAM テーブルを使用している場合、参照整合性は強制されません。その結果、データベースの外部キーを「偽装」できるかもしれません。しかし、この設定は Django では公式にはサポートされていません。</p>\n</section>\n<section id=\"behavior-of-contrib-apps\">\n<span id=\"contrib-app-multiple-databases\"></span><h3>contribアプリの振る舞い<a class=\"heading-anchor\" href=\"#behavior-of-contrib-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>いくつかのcontribアプリはモデルを含み、いくつかのアプリは他のアプリに依存しています。データベースをまたいだリレーションシップは不可能であるため、データベースをまたいでこれらのモデルを分割する方法に制限が生じます:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">contenttypes.ContentType</code>, <code class=\"docutils literal notranslate\">sessions.Session</code>, <code class=\"docutils literal notranslate\">sites.Site</code> はいずれも、適切なルーターがあれば、どのデータベースにも格納できます。</p></li>\n<li><p><code class=\"docutils literal notranslate\">User</code> 、<code class=\"docutils literal notranslate\">Group</code> 、<code class=\"docutils literal notranslate\">Permission</code> の <code class=\"docutils literal notranslate\">auth</code> モデルは <code class=\"docutils literal notranslate\">ContentType</code> とリンクしているため、 <code class=\"docutils literal notranslate\">ContentType</code> と同じデータベースに保存する必要があります。</p></li>\n<li><p><code class=\"docutils literal notranslate\">admin</code> は <code class=\"docutils literal notranslate\">auth</code> に依存しているので、そのモデルは <code class=\"docutils literal notranslate\">auth</code> と同じデータベースに置く必要があります。</p></li>\n<li><p><code class=\"docutils literal notranslate\">flatpages</code> と <code class=\"docutils literal notranslate\">redirects</code> は <code class=\"docutils literal notranslate\">sites</code> に依存しているため、それらのモデルは <code class=\"docutils literal notranslate\">sites</code> と同じデータベースに置く必要があります。</p></li>\n</ul>\n<p>さらに、下記のようないくつかのオブジェクトは <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> がデータベースにテーブルを作成した直後に自動的に作成されます:</p>\n<ul class=\"simple\">\n<li><p>デフォルトの <code class=\"docutils literal notranslate\">Site</code>、</p></li>\n<li><p>各モデル (そのデータベースに保存されていないものも含む) の <code class=\"docutils literal notranslate\">ContentType</code> 、</p></li>\n<li><p>各モデル（そのデータベースに保存されていないものも含む）の <code class=\"docutils literal notranslate\">Permission</code> 。</p></li>\n</ul>\n<p>複数のデータベースを使用する通常のセットアップでは、これらのオブジェクトを複数のデータベースに持つことは有益ではありません。通常のセットアップには、プライマリ/レプリカや外部データベースへの接続などがあります。そのため、これら3つのモデルを1つのデータベースだけに同期させることができる <a class=\"reference internal\" href=\"#topics-db-multi-db-routing\"><span class=\"std std-ref\">データベースルーター</span></a> を書くことを推奨します。複数のデータベースのテーブルを必要としないcontribやサードパーティアプリにも同じアプローチを使用してください。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>コンテンツ・タイプを複数のデータベースに同期する場合、データベース間でプライマリ・キーが一致しない可能性があることに注意してください。その結果、データが破損したり、データが失われたりする可能性があります。</p>\n</aside>\n</section>\n</section>","rootId":"multiple-databases","toc":[{"title":"データベースを定義する","anchor":"defining-your-databases","children":[]},{"title":"データベースを同期する","anchor":"synchronizing-your-databases","children":[{"title":"他の管理コマンドを使用する","anchor":"using-other-management-commands","children":[]}]},{"title":"自動的なデータベースのルーティング","anchor":"automatic-database-routing","children":[{"title":"データベース ルーター","anchor":"database-routers","children":[{"title":"ヒント","anchor":"hints","children":[]}]},{"title":"ルーターを使用する","anchor":"using-routers","children":[]},{"title":"例","anchor":"an-example","children":[]}]},{"title":"データベースを手動で選択する","anchor":"manually-selecting-a-database","children":[{"title":"QuerySet のためのデータベースを手動で選択する","anchor":"manually-selecting-a-database-for-a-queryset","children":[]},{"title":"save() のためのデータベースを選択する","anchor":"selecting-a-database-for-save","children":[{"title":"オブジェクトを1つのデータベースからもう1つのデータベースに移動する","anchor":"moving-an-object-from-one-database-to-another","children":[]}]},{"title":"削除が行われるデータベースを選択する","anchor":"selecting-a-database-to-delete-from","children":[]},{"title":"複数のデータベースでマネージャを使う","anchor":"using-managers-with-multiple-databases","children":[{"title":"複数のデータベースで get_queryset() を使う","anchor":"using-get-queryset-with-multiple-databases","children":[]}]}]},{"title":"Django の管理インタフェースで複数のデータベースを公開する","anchor":"exposing-multiple-databases-in-django-s-admin-interface","children":[]},{"title":"複数のデータベースで生のカーソルを使う","anchor":"using-raw-cursors-with-multiple-databases","children":[]},{"title":"複数データベースの制約","anchor":"limitations-of-multiple-databases","children":[{"title":"データベースをまたぐリレーション","anchor":"cross-database-relations","children":[]},{"title":"contribアプリの振る舞い","anchor":"behavior-of-contrib-apps","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/5.2/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/5.2/topics/db/"}],"prev":{"docname":"topics/db/transactions","title":"データベースのトランザクション","url":"/ja/5.2/topics/db/transactions/"},"next":{"docname":"topics/db/tablespaces","title":"テーブル空間（tablespace）","url":"/ja/5.2/topics/db/tablespaces/"},"formats":{"html":"/ja/5.2/topics/db/multi-db/","markdown":"/ja/5.2/topics/db/multi-db.md","json":"/ja/5.2/topics/db/multi-db.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/db/multi-db.txt","official":"https://docs.djangoproject.com/ja/5.2/topics/db/multi-db/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}