{"title":"データベース","version":"5.2","locale":"ja","docname":"ref/databases","url":"/ja/5.2/ref/databases/","canonical":"https://djangodocs.dev/ja/5.2/ref/databases/","summary":"Django は次のデータベースを公式にサポートしています。 PostgreSQL MariaDB MySQL Oracle SQLite サードパーティから提供されているデータベースバックエンド も多数あります。 Django…","html":"<h1>データベース<a class=\"heading-anchor\" href=\"#databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django は次のデータベースを公式にサポートしています。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#postgresql-notes\"><span class=\"std std-ref\">PostgreSQL</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#mariadb-notes\"><span class=\"std std-ref\">MariaDB</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#mysql-notes\"><span class=\"std std-ref\">MySQL</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#oracle-notes\"><span class=\"std std-ref\">Oracle</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#sqlite-notes\"><span class=\"std std-ref\">SQLite</span></a></p></li>\n</ul>\n<p><a class=\"reference internal\" href=\"#third-party-notes\"><span class=\"std std-ref\">サードパーティから提供されているデータベースバックエンド</span></a> も多数あります。</p>\n<p>Django はすべてのデータベースで可能な限り多くの機能をサポートするように努めています。しかし、すべてのデータベースバックエンドが似ているわけではないため、どの機能をサポートし、どのような前提なら安全に想定できるのかについて、設計上の決断を下す必要がありました。</p>\n<p>このファイルは Django の利用に関係する可能性のある一部の機能を説明しています。サーバー固有のドキュメントやリファレンスマニュアルを置換することを意図したものではありません。</p>\n<section id=\"general-notes\">\n<h2>一般的なメモ<a class=\"heading-anchor\" href=\"#general-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"persistent-connections\">\n<span id=\"persistent-database-connections\"></span><h3>持続的 (persistent) な接続<a class=\"heading-anchor\" href=\"#persistent-connections\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>持続的な接続は HTTP リクエストごとにデータベースへの接続を再確立するオーバーヘッドを回避します。持続的な接続は接続の最大寿命を定義する <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> パラメータによって制御されます。このパラメータはデータベースごとに個別に設定できます。</p>\n<p>デフォルト値は <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> で、各リクエストの終了時にデータベース接続をクローズするという従来の動作を維持します。持続的な接続を有効にするには、 <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> に秒単位の正の整数を設定します。持続的な接続を無制限にするには、<code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> に設定します。</p>\n<p>ASGI を使用する場合、永続的なデータベース接続は無効にすべきです。代わりに、利用可能であればデータベースバックエンドが提供する接続プーリング機能を使用するか、必要に応じてサードパーティ製の接続プーリングの利用を検討してください。</p>\n<section id=\"connection-management\">\n<h4>接続管理<a class=\"heading-anchor\" href=\"#connection-management\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django は、最初にデータベースへの問い合わせを行うときに、データベースへの接続をオープンします。Django はこの接続をオープンしたままにしておき、その後のリクエストで再利用します。Django は接続が <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> で定義された最大寿命を超えたり、それ以上使えなくなると接続をクローズします。</p>\n<p>正確には、Djangoは必要なときに、または接続がない場合（これが最初の接続であるか、前の接続がクローズされていた場合）に自動的にデータベースへの接続をオープンします。</p>\n<p>各リクエストの最初に、Django は接続が最大寿命に達した場合、接続をクローズします。もしデータベースがアイドル状態の接続をしばらくしてから終了するのであれば、 <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> を低い値に設定して、Django がデータベースサーバにすでに終了した接続を使おうとしないようにすべきです。(この問題は、非常にトラフィックの少ないサイトにしか影響しないかもしれません)。</p>\n<p>各リクエストの終了時に、 Django は接続が最大寿命に達していたり、回復不可能なエラー状態になっていたりすると、接続をクローズします。リクエストの処理中にデータベースエラーが発生した場合、 Django は接続がまだ動作しているかどうかをチェックし、動作していなければ接続をクローズします。接続が使えなくなると、次のリクエストは新しい接続を取得します。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-CONN_HEALTH_CHECKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_HEALTH_CHECKS</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定することで、接続の再利用の堅牢性を向上させ、データベースサーバーによって接続がクローズされた後に新しい接続を受け入れて提供する準備ができている場合（例えば、データベースサーバーの再起動後など）にエラーを防ぐことができます。ヘルスチェックはリクエストごとに一度だけ実行され、リクエストの処理中にデータベースがアクセスされている場合のみ実行されます。</p>\n</section>\n<section id=\"caveats\">\n<h4>注意事項<a class=\"heading-anchor\" href=\"#caveats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>各スレッドは独自の接続を維持するため、データベースは少なくともワーカースレッドと同数の同時接続をサポートする必要があります。</p>\n<p>データベースが外部システムのデータベースであったり、キャッシュのおかげでビューの大部分からアクセスされないことがあります。このような場合、 <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> を低い値、あるいは <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code> に設定する必要があります。これにより、このデータベースへの同時接続数を少なく保つことができます。</p>\n<p>開発用サーバはリクエストを処理するたびに新しいスレッドを生成し、 持続的な接続の効果を無効にします。開発中は有効にしないでください。</p>\n<p>Django がデータベースへの接続を確立するとき、使われているバックエンドに応じて適切なパラメータを設定します。持続的な接続を有効にすると、この設定はリクエストの度に繰り返されなくなります。接続の分離レベルやタイムゾーンなどのパラメータを変更した場合は、リクエストの最後に Django のデフォルトに戻すか、リクエストの最初に適切な値を設定するか、持続的な接続を無効にしてください。</p>\n<p>長時間実行されるプロセスで接続が作成された場合、Django のリクエスト－レスポンスサイクル外では、接続は明示的に閉じるか、タイムアウトが発生するまで開いたままになります。<code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.close_old_connections()</span></code> を使用して、すべての古いまたは使用できない接続を閉じることができます。</p>\n</section>\n</section>\n<section id=\"encoding\">\n<h3>エンコーディング<a class=\"heading-anchor\" href=\"#encoding\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django はすべてのデータベースが UTF-8 エンコーディングを使用することを想定しています。他のエンコーディングを使用すると、Django にとっては有効なデータに対して、データベースから「value too long (値が大きすぎる)」エラーなどの予期しない動作が起こる可能性があります。データベースを正しく設定する方法については、以下のデータベース固有のノートを確認してください。</p>\n</section>\n</section>\n<section id=\"postgresql-notes\">\n<span id=\"id1\"></span><h2>PostgreSQL に関するノート<a class=\"heading-anchor\" href=\"#postgresql-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は PostgreSQL 14 以上をサポートします。 <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/\">psycopg</a> 3.1.8+ または <a class=\"reference external\" href=\"https://www.psycopg.org/\">psycopg2</a> 2.8.4+ が必要ですが、最新の <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/\">psycopg</a> 3.1.8+ が推奨されます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">psycopg2</span></code> のサポートは、将来のある時点で非推奨となり削除される可能性があります。</p>\n</aside>\n<section id=\"postgresql-connection-settings\">\n<span id=\"id2\"></span><h3>PostgreSQL の接続設定<a class=\"heading-anchor\" href=\"#postgresql-connection-settings\"><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-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> を参照してください。</p>\n<p><a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/libpq-pgservice.html\">connection service file</a> のサービス名と <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/libpq-pgpass.html\">password file</a> のパスワードを使用して接続するためには、それらを <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> 内のデータベース設定の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分で指定しなければなりません。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"n\">DATABASES</span> <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;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;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;service&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;my_service&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;passfile&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;.my_pgpass&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">.pg_service.conf</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>[my_service]\nhost=localhost\nuser=USER\ndbname=NAME\nport=5432\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">.my_pgpass</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>localhost:5432:NAME:USER:PASSWORD\n</code></pre></figure>\n<p>PostgreSQLバックエンドは <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> の内容をキーワード引数として接続コンストラクタに渡します。これにより、ドライバの動作をより高度に制御できます。利用可能なすべての <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS\">parameters</a> についてはPostgreSQLのドキュメントで詳しく説明されています。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>テスト目的のサービス名の使用はサポートされていません。これは <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/33685\">将来実装される可能性があります</a> 。</p>\n</aside>\n</section>\n<section id=\"optimizing-postgresql-s-configuration\">\n<h3>PostgreSQL の設定を最適化する<a class=\"heading-anchor\" href=\"#optimizing-postgresql-s-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django はデータベース接続のために次のパラメータが必要です。</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">client_encoding</span></code>: <code class=\"docutils literal notranslate\"><span class=\"pre\">'UTF8'</span></code>,</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">default_transaction_isolation</span></code>: デフォルトの <code class=\"docutils literal notranslate\"><span class=\"pre\">'read</span> <span class=\"pre\">committed'</span></code> または接続オプションで設定した値 (以下を参照)。</p></li>\n<li><dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">timezone</span></code>:</dt><dd><ul>\n<li><p><a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> のとき、デフォルトの <code class=\"docutils literal notranslate\"><span class=\"pre\">'UTC'</span></code> または接続のために設定した <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> の値。</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> のとき、グローバルの <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> 設定の値。</p></li>\n</ul>\n</dd>\n</dl>\n</li>\n</ul>\n<p>これらのパラメータがすでに正しい値を持っている場合、 Django は新しい接続のたびにパラメータを設定しないので、パフォーマンスが少し改善されます。これらのパラメータは <code class=\"file docutils literal notranslate\"><span class=\"pre\">postgresql.conf</span></code> で直接設定することもできますし、 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-alterrole.html\">ALTER ROLE</a> でデータベースユーザごとに設定することもできます。</p>\n<p>Django はこの最適化なしでも問題なく動作しますが、新しい接続のたびに、これらのパラメータを設定するために追加のクエリを実行します。</p>\n</section>\n<section id=\"isolation-level\">\n<span id=\"database-isolation-level\"></span><h3>分離レベル (isolation level)<a class=\"heading-anchor\" href=\"#isolation-level\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>PostgreSQL 自体と同様に、Django のデフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">READ</span> <span class=\"pre\">COMMITTED</span></code> の <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/transaction-iso.html\">isolation level</a> に設定されています。<code class=\"docutils literal notranslate\"><span class=\"pre\">REPEATABLE</span> <span class=\"pre\">READ</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">SERIALIZABLE</span></code> などのより高いレベルの分離レベルが必要な場合は、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> 内のデータベース設定の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分に指定してください。</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=\"w\"> </span><span class=\"nn\">django.db.backends.postgresql.psycopg_any</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">IsolationLevel</span>\n\n<span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;isolation_level&quot;</span><span class=\"p\">:</span> <span class=\"n\">IsolationLevel</span><span class=\"o\">.</span><span class=\"n\">SERIALIZABLE</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>より高い分離レベルのもとでは、アプリケーションはシリアライズの失敗時に発生する例外を処理できるように準備しておく必要があります。このオプションは高度な利用のために設計されています。</p>\n</aside>\n</section>\n<section id=\"role\">\n<span id=\"database-role\"></span><h3>ロール<a class=\"heading-anchor\" href=\"#role\"><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-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> 内のデータベース設定の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分で指定してください。</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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.postgresql&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;assume_role&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;my_application_role&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"connection-pool\">\n<span id=\"postgresql-pool\"></span><h3>接続プール<a class=\"heading-anchor\" href=\"#connection-pool\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.1\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<p><a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/\">psycopg</a> で接続プールを使用するには、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> のデータベース設定内の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分で <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pool&quot;</span></code> を設定し、これを <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/api/pool.html#psycopg_pool.ConnectionPool\" title=\"(in psycopg)\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ConnectionPool</span></code></a> に渡す辞書にするか、<code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定して <code class=\"docutils literal notranslate\"><span class=\"pre\">ConnectionPool</span></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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.postgresql&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;pool&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <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\"><span class=\"pre\">psycopg[pool]</span></code> または <a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/psycopg-pool/\">psycopg-pool</a> がインストールされている必要があり、<code class=\"docutils literal notranslate\"><span class=\"pre\">psycopg2</span></code> では無視されます。</p>\n</section>\n<section id=\"server-side-parameters-binding\">\n<span id=\"database-server-side-parameters-binding\"></span><h3>サーバーサイド パラメータ バインディング<a class=\"heading-anchor\" href=\"#server-side-parameters-binding\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/\">psycopg</a> 3.1.8+ では、Django のデフォルトは <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/advanced/cursors.html#client-side-binding-cursors\" title=\"(in psycopg)\"><span class=\"xref std std-ref\">クライアントサイド・バインディングカーソル</span></a> です。もし <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html#server-side-binding\" title=\"(in psycopg)\"><span class=\"xref std std-ref\">サーバーサイド・バインディング</span></a> を使いたい場合は、 <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> のデータベース設定の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> の部分で設定してください：</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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.postgresql&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;server_side_binding&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <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\"><span class=\"pre\">psycopg2</span></code> では無視されます。</p>\n</section>\n<section id=\"indexes-for-varchar-and-text-columns\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">varchar</span></code> カラムと <code class=\"docutils literal notranslate\"><span class=\"pre\">text</span></code> カラムのインデックス<a class=\"heading-anchor\" href=\"#indexes-for-varchar-and-text-columns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>モデルフィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">db_index=True</span></code> を指定すると、Django は通常 1 つの <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">INDEX</span></code> ステートメントを出力します。しかし、フィールドのデータベースタイプが <code class=\"docutils literal notranslate\"><span class=\"pre\">varchar</span></code> か <code class=\"docutils literal notranslate\"><span class=\"pre\">text</span></code> (例えば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>、 <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code>、 <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> で使われます) の場合、Django はカラムに適切な <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/indexes-opclass.html\">PostgreSQL operator class</a> を使う追加のインデックスを作成します。この追加インデックスは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">startswith</span></code> のような <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> 演算子を SQL で使ったルックアップを正しく実行するために必要です。</p>\n</section>\n<section id=\"migration-operation-for-adding-extensions\">\n<h3>拡張機能を追加するためのマイグレーション・オペレーション<a class=\"heading-anchor\" href=\"#migration-operation-for-adding-extensions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>マイグレーションを使用して PostgreSQL 拡張機能 (<code class=\"docutils literal notranslate\"><span class=\"pre\">hstore</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">postgis</span></code> など) を追加する必要がある場合は、 <a class=\"reference internal\" href=\"/ja/5.2/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CreateExtension\" title=\"django.contrib.postgres.operations.CreateExtension\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CreateExtension</span></code></a> オペレーションを使用してください。</p>\n</section>\n<section id=\"server-side-cursors\">\n<span id=\"postgresql-server-side-cursors\"></span><h3>サーバーサイド・カーソル<a class=\"heading-anchor\" href=\"#server-side-cursors\"><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/models/querysets/#django.db.models.query.QuerySet.iterator\" title=\"django.db.models.query.QuerySet.iterator\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.iterator()</span></code></a> を使うと、 Django は <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/advanced/cursors.html#server-side-cursors\" title=\"(in psycopg)\"><span class=\"xref std std-ref\">サーバーサイドカーソル</span></a> をオープンします。デフォルトでは、PostgreSQL はカーソルクエリの結果の最初の10%だけがフェッチされると仮定しています。クエリプランナはクエリの計画に費やす時間を減らし、より速く結果を返すようになりますが、結果の10%以上が取得された場合、性能が低下する可能性があります。PostgreSQLがカーソルクエリで取得する行数に関する仮定を制御するには、 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-CURSOR-TUPLE-FRACTION\">cursor_tuple_fraction</a> オプションを使用してください。</p>\n<section id=\"transaction-pooling-and-server-side-cursors\">\n<span id=\"transaction-pooling-server-side-cursors\"></span><h4>トランザクションプールとサーバーサイドカーソル<a class=\"heading-anchor\" href=\"#transaction-pooling-and-server-side-cursors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>トランザクションプーリングモード（たとえば、<a class=\"reference external\" href=\"https://www.pgbouncer.org/\">PgBouncer</a> ）で接続プーラを使用するには、その接続のサーバーサイドカーソルを無効にする必要があります。</p>\n<p>サーバーサイドカーソルは接続に対してローカルに存在し、 <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE-AUTOCOMMIT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTOCOMMIT</span></code></a> が <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> の場合、トランザクションの終了時にも接続をオープンしたままにします。後続のトランザクションはサーバーサイドカーソルからより多くの結果を取得しようとするかもしれません。トランザクションプーリングモードでは、後続のトランザクションが同じ接続を使用するという保証はありません。異なる接続が使用される場合、トランザクションがサーバーサイドカーソルを参照する時にエラーが発生します。サーバーサイドカーソルは、それが作成された接続でのみアクセス可能だからです。</p>\n<p>一つの解決策は、 <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> で <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DISABLE_SERVER_SIDE_CURSORS</span></code></a> を <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> に設定して、接続のサーバーサイドカーソルを無効にすることです。</p>\n<p>トランザクションプーリングモードでサーバーサイドカーソルの恩恵を受けるには、サーバーサイドカーソルを使用するクエリを実行するために、<a class=\"reference internal\" href=\"/ja/5.2/topics/db/multi-db/\"><span class=\"doc\">データベースへのもう1つの接続</span></a> を設定します。この接続はデータベースに直接接続するか、セッションプーリングモードの接続プーラに接続する必要があります。</p>\n<p>もう一つの方法は、サーバーサイドのカーソルを使用している <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> を <a class=\"reference internal\" href=\"/ja/5.2/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a> ブロックでラップすることです。これはトランザクションの間、 <code class=\"docutils literal notranslate\"><span class=\"pre\">autocommit</span></code> を無効にするからです。これにより、サーバーサイドカーソルはトランザクションの間だけ生きることになります。</p>\n</section>\n</section>\n<section id=\"manually-specifying-values-of-auto-incrementing-primary-keys\">\n<span id=\"manually-specified-autoincrement-pk\"></span><h3>自動インクリメントの主キーの値を手動で指定する<a class=\"heading-anchor\" href=\"#manually-specifying-values-of-auto-incrementing-primary-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django は自動インクリメントの主キーを格納するために PostgreSQL の identity カラムを使います。identity カラムには、次に利用可能な値を追跡する <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createsequence.html\">sequence</a> の値が代入されます。自動インクリメントのフィールドに手動で値を代入しても、フィールドのシーケンスは更新されません。たとえば下記のようになります：</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;alice&quot;</span><span class=\"p\">,</span> <span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;User: alice&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># The sequence hasn&#39;t been updated; its next value is 1.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;bob&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">IntegrityError: duplicate key value violates unique constraint</span>\n<span class=\"go\">&quot;auth_user_pkey&quot; DETAIL:  Key (id)=(1) already exists.</span>\n</code></pre></div>\n<p>そのような値を指定する必要がある場合は、既にテーブルにある値を再利用しないように、後でシーケンスをリセットしてください。 <a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-sqlsequencereset\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">sqlsequencereset</span></code></a> 管理コマンドはそのための SQL 文を生成します。</p>\n</section>\n<section id=\"test-database-templates\">\n<h3>テストデータベースのテンプレート<a class=\"heading-anchor\" href=\"#test-database-templates\"><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-TEST_TEMPLATE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST['TEMPLATE']</span></code></a> 設定を使用すると、テストデータベースを作成するための <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createdatabase.html\">template</a> (たとえば <code class=\"docutils literal notranslate\"><span class=\"pre\">'template0'</span></code>) を指定できます。</p>\n</section>\n<section id=\"speeding-up-test-execution-with-non-durable-settings\">\n<h3>non-durable 設定でテストの実行を高速化する<a class=\"heading-anchor\" href=\"#speeding-up-test-execution-with-non-durable-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/non-durability.html\">PostgreSQL を non-durable に設定する</a> ことで、テストの実行時間を短縮できます。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>これは危険です。サーバがクラッシュしたり電源が切れたりした場合に、データベースがデータ損失や破損の影響を受けやすくなります。クラスタ内の全データベースの内容を簡単にリストアできる開発マシンでのみ使用してください。</p>\n</aside>\n</section>\n</section>\n<section id=\"mariadb-notes\">\n<span id=\"id4\"></span><h2>MariaDB に関するノート<a class=\"heading-anchor\" href=\"#mariadb-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は MariaDB 10.5 以上をサポートします。</p>\n<p>MariaDBを使用するには、MySQLバックエンドを使用してください、これは2つの間で共有されています。詳細は <a class=\"reference internal\" href=\"#mysql-notes\"><span class=\"std std-ref\">MySQL に関するノート</span></a> を参照してください。</p>\n</section>\n<section id=\"mysql-notes\">\n<span id=\"id5\"></span><h2>MySQL に関するノート<a class=\"heading-anchor\" href=\"#mysql-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"version-support\">\n<h3>バージョン サポート<a class=\"heading-anchor\" href=\"#version-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django は MySQL 8.0.11 以降をサポートしています。</p>\n<p>Django の <code class=\"docutils literal notranslate\"><span class=\"pre\">inspectdb</span></code> 機能は <code class=\"docutils literal notranslate\"><span class=\"pre\">information_schema</span></code> データベースを使います。このデータベースには全てのデータベーススキーマの詳細なデータが含まれています。</p>\n<p>Django は、データベースが Unicode (UTF-8 エンコーディング) をサポートすることを期待し、 トランザクションと参照整合性を強制するタスクを MySQL に委譲します。MyISAM ストレージエンジンを使う場合、MySQL が後者 2 つを実際には強制していないという事実に注意することが重要です。次の節を参照してください。</p>\n</section>\n<section id=\"storage-engines\">\n<span id=\"mysql-storage-engines\"></span><h3>ストレージ エンジン<a class=\"heading-anchor\" href=\"#storage-engines\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL にはいくつかの <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/storage-engines.html\">storage engines</a> があります。サーバ設定でデフォルトのストレージエンジンを変更できます。</p>\n<p>MySQL のデフォルトのストレージエンジンは <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/innodb-storage-engine.html\">InnoDB</a> です。このエンジンは完全にトランザクショナルで、外部キー参照をサポートしています。推奨される選択です。しかし、InnoDB は <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTO_INCREMENT</span></code> の値を記憶せず、&quot;max(id)+1&quot; として再作成するため、MySQL の再起動時に自動インクリメントカウンタが失われます。このため、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a> の値が不用意に再利用される可能性があります。</p>\n<p><a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/myisam-storage-engine.html\">MyISAM</a> の主な欠点は、トランザクションをサポートしていないことと、外部キー制約を強制していないことです。</p>\n</section>\n<section id=\"mysql-db-api-drivers\">\n<span id=\"id7\"></span><h3>MySQL DB API ドライバ<a class=\"heading-anchor\" href=\"#mysql-db-api-drivers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL には <span class=\"target\" id=\"index-2\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a> で説明されている Python Database API を実装したドライバがいくつかあります：</p>\n<ul class=\"simple\">\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/mysqlclient/\">mysqlclient</a> はネイティブドライバです。 <strong>推奨される選択肢です</strong> 。</p></li>\n<li><p><a class=\"reference external\" href=\"https://dev.mysql.com/downloads/connector/python/\">MySQL Connector/Python</a> は Oracle による純粋な Python ドライバで、MySQL クライアントライブラリや標準ライブラリ以外の Python モジュールを必要としません。</p></li>\n</ul>\n<p>DB API ドライバに加え、Django は ORM からデータベースドライバにアクセスするためのアダプタが必要です。Django は mysqlclient 用のアダプタを提供しますが、MySQL Connector/Python には内蔵のアダプタ (<a class=\"reference external\" href=\"https://dev.mysql.com/doc/connector-python/en/connector-python-django-backend.html\">its own</a>) があります。</p>\n<section id=\"mysqlclient\">\n<h4>mysqlclient<a class=\"heading-anchor\" href=\"#mysqlclient\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django には <a class=\"reference internal\" href=\"#mysqlclient\">mysqlclient</a> 1.4.3 以降が必要です。</p>\n</section>\n<section id=\"id8\">\n<h4>MySQL Connector/Python<a class=\"heading-anchor\" href=\"#id8\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>MySQL Connector/Python は <a class=\"reference external\" href=\"https://dev.mysql.com/downloads/connector/python/\">download page</a> から入手できます。Django アダプタはバージョン 1.1.X 以降で利用可能です。Django の最新リリースには対応していないかもしれません。</p>\n</section>\n</section>\n<section id=\"time-zone-definitions\">\n<span id=\"mysql-time-zone-definitions\"></span><h3>タイムゾーンの定義<a class=\"heading-anchor\" href=\"#time-zone-definitions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django の <a class=\"reference internal\" href=\"/ja/5.2/topics/i18n/timezones/\"><span class=\"doc\">タイムゾーンサポート</span></a> を使うつもりなら、 <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html\">mysql_tzinfo_to_sql</a> を使って MySQL データベースにタイムゾーンテーブルを読み込んでください。これはデータベースごとではなく、MySQLサーバーに対して一度だけ行う必要があります。</p>\n</section>\n<section id=\"creating-your-database\">\n<h3>データベースを作成する<a class=\"heading-anchor\" href=\"#creating-your-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>コマンドラインツールで以下のSQLを実行することで、データベースを作成 (<a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/create-database.html\">create your database</a>) できます:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">DATABASE</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"n\">dbname</span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"nb\">CHARACTER</span><span class=\"w\"> </span><span class=\"k\">SET</span><span class=\"w\"> </span><span class=\"n\">utf8mb4</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>これにより、すべてのテーブルとカラムがデフォルトでUTF-8を使用するようになります。</p>\n<section id=\"collation-settings\">\n<span id=\"mysql-collation\"></span><h4>照合順序 (collation) の設定<a class=\"heading-anchor\" href=\"#collation-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>カラムの照合順序 (collation) の設定は、どの文字列を等しいものとして比較するかだけでなく、データをソートする順序も制御します。 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.CharField.db_collation\" title=\"django.db.models.CharField.db_collation\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> と <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.TextField.db_collation\" title=\"django.db.models.TextField.db_collation\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">TextField</span></code></a> には <code class=\"docutils literal notranslate\"><span class=\"pre\">db_collation</span></code> パラメータを指定して、カラムの照合順序を設定できます。</p>\n<p>照合順序はデータベース全体およびテーブルごとに設定することもできます。これについては、MySQL ドキュメント <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/charset.html\">documented thoroughly</a> で詳しく説明されています。このような場合、照合順序はデータベースの設定やテーブルを直接操作して設定する必要があります。Django はそれらを変更する API を提供しません。</p>\n<p>デフォルトでは、UTF-8 データベースでは、MySQL は <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8mb4_0900_ai_ci</span></code> 照合順序を使用します。この結果、すべての文字列の等値比較は <em>大文字小文字を区別しない</em> 方法で行われます。つまり、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Fred&quot;</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;freD&quot;</span></code> はデータベースレベルでは等しいとみなされます。フィールドにユニーク制約がある場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;aa&quot;</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;AA&quot;</span></code> の両方を同じカラムに挿入しようとするのは不正です。デフォルトの照合順序では等しい (つまり一意ではない) と比較されるからです。特定のカラムやテーブルで大文字小文字を区別して比較したい場合は、そのカラムやテーブルを <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8mb4_0900_as_cs</span></code> 照合順序を使用するように変更してください。</p>\n<p><a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/charset-unicode-sets.html\">MySQL Unicode Character Sets</a> によると、照合順序 <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8mb4_general_ci</span></code> の比較は、<code class=\"docutils literal notranslate\"><span class=\"pre\">utf8mb4_general_ci</span></code> の比較よりも高速ですが、正しさは若干劣ることに注意してください。もしこれがあなたのアプリケーションで許容できるのであれば、 <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8mb4_general_ci</span></code> を使うべきです。これが許容できない場合(例えば、ドイツ語の辞書の並び順が必要な場合)、より正確な <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8mb4_general_ci</span></code> を使用してください。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>モデルのフォームセットは大文字小文字を区別して一意なフィールドをバリデーションします。したがって、大文字小文字を区別しない照合順序を使用している場合、大文字小文字の違いだけで一意なフィールド値を持つフォームセットはバリデーションを通過しますが、 <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> を呼び出すと <code class=\"docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code> が発生します。</p>\n</aside>\n</section>\n</section>\n<section id=\"connecting-to-the-database\">\n<h3>データベースに接続する<a class=\"heading-anchor\" href=\"#connecting-to-the-database\"><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/\"><span class=\"doc\">設定のドキュメント</span></a> を参照してください。</p>\n<p>接続設定はこの順番で使用されます：</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a>, <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a>, <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD</span></code></a>, <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a>,\n<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a></p></li>\n<li><p>MySQL オプションファイル。</p></li>\n</ol>\n<p>言い換えると、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> でデータベースの名前を設定した場合、これは <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> よりも優先されます。これは <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/option-files.html\">MySQL option file</a> の内容を上書きすることになります。</p>\n<p>以下は MySQL オプションファイルを使用するサンプル設定です：</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=\"c1\"># settings.py</span>\n<span class=\"n\">DATABASES</span> <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;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;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;read_default_file&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/path/to/my.cnf&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<div class=\"code-block\" data-language=\"ini\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</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=\"Ini code\"><code><span class=\"c1\"># my.cnf</span>\n<span class=\"k\">[client]</span>\n<span class=\"na\">database</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">NAME</span>\n<span class=\"na\">user</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">USER</span>\n<span class=\"na\">password</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">PASSWORD</span>\n<span class=\"na\">default-character-set</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">utf8mb4</span>\n</code></pre></div>\n<p>他にも <code class=\"docutils literal notranslate\"><span class=\"pre\">ssl</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">init_command</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code> などの <a class=\"reference external\" href=\"https://mysqlclient.readthedocs.io/user_guide.html#functions-and-attributes\">MySQLdb connection options</a> が役に立ちます。</p>\n<section id=\"setting-sql-mode\">\n<span id=\"mysql-sql-mode\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code> の設定<a class=\"heading-anchor\" href=\"#setting-sql-mode\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code> オプションのデフォルト値には <code class=\"docutils literal notranslate\"><span class=\"pre\">STRICT_TRANS_TABLES</span></code> が含まれています。このオプションは、挿入時にデータが切り捨てられた場合に警告をエラーにエスカレートさせるため、Djangoはデータ損失を防ぐためにMySQLで <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-mode.html#sql-mode-strict\">strict mode</a> を有効にすることを強く推奨します (<code class=\"docutils literal notranslate\"><span class=\"pre\">STRICT_TRANS_TABLES</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">STRICT_ALL_TABLES</span></code> のいずれか)。</p>\n<p>SQLモードをカスタマイズする必要がある場合は、他のMySQLオプションと同様に <code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code> 変数を設定できます。設定ファイル内、または <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> のデータベース設定の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分に <code class=\"docutils literal notranslate\"><span class=\"pre\">'init_command':</span> <span class=\"pre\">&quot;SET</span> <span class=\"pre\">sql_mode='STRICT_TRANS_TABLES'&quot;</span></code> エントリを追加することで設定できます。</p>\n</section>\n<section id=\"mysql-isolation-level\">\n<span id=\"id9\"></span><h4>分離レベル (isolation level)<a class=\"heading-anchor\" href=\"#mysql-isolation-level\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>並行読み込みを実行する場合、異なるセッション（例えば、異なるリクエストを処理する別々のスレッド）からのデータベース・トランザクションは互いに影響し合う可能性があります。これらの相互作用は各セッションの <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/innodb-transaction-isolation-levels.html\">transaction isolation level</a> の影響を受けます。接続の分離レベルは <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分にある <code class=\"docutils literal notranslate\"><span class=\"pre\">'isolation_level'</span></code> エントリで設定できます。このエントリの有効な値は4つの標準的な分離レベルです：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'read</span> <span class=\"pre\">uncommitted'</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'read</span> <span class=\"pre\">committed'</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'repeatable</span> <span class=\"pre\">read'</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'serializable'</span></code></p></li>\n</ul>\n<p>または <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> でサーバで設定された分離レベルを使用します。しかし、Djangoでは MySQL のデフォルトである repeatable read ではなく、read commited を推奨し、デフォルトとしています。repeatable read ではデータ損失が発生する可能性があります。特に、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a> は <a class=\"reference internal\" href=\"/ja/5.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a> を発生させますが、その後の <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> 呼び出しではオブジェクトが表示されないような場合があります。</p>\n</section>\n</section>\n<section id=\"creating-your-tables\">\n<h3>テーブルを作成する<a class=\"heading-anchor\" href=\"#creating-your-tables\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django はスキーマを生成するとき、ストレージエンジンを指定しないので、テーブルはデータベースサーバが設定したデフォルトのストレージエンジンで作成されます。最も簡単な解決策は、データベースサーバのデフォルトのストレージエンジンを、希望のエンジンに設定することです。</p>\n<p>ホスティングサービスを利用していて、サーバーのデフォルトストレージエンジンを変更できない場合、いくつかの選択肢があります。</p>\n<ul>\n<li><p>テーブルが作成された後、 <code class=\"docutils literal notranslate\"><span class=\"pre\">ALTER</span> <span class=\"pre\">TABLE</span></code> ステートメントを実行して、テーブルを新しいストレージエンジン（InnoDBなど）に変換します：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">ALTER</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"n\">tablename</span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">ENGINE</span><span class=\"o\">=</span><span class=\"n\">INNODB</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>これはテーブルの数が多い場合、面倒です。</p>\n</li>\n<li><p>テーブルを作成する前に MySQLdb の <code class=\"docutils literal notranslate\"><span class=\"pre\">init_command</span></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=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;init_command&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;SET default_storage_engine=INNODB&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>これは、データベース接続時のデフォルトのストレージエンジンを設定します。テーブルが作成された後は、このオプションを削除してください。テーブルの作成時にのみ必要なクエリを各データベース接続に追加することになります。</p>\n</li>\n</ul>\n</section>\n<section id=\"table-names\">\n<h3>テーブル名<a class=\"heading-anchor\" href=\"#table-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL の最新バージョンでも、特定の条件下で特定の SQL 文を実行すると、テーブル名の大文字と小文字が変わってしまうという既知の問題 <a class=\"reference external\" href=\"https://bugs.mysql.com/bug.php?id=48875\">known issues</a> があります。この動作から発生する可能性のある問題を避けるために、可能であれば小文字のテーブル名を使うことをお勧めします。Django はモデルからテーブル名を自動生成するときに小文字のテーブル名を使うので、これは主に <a class=\"reference internal\" href=\"/ja/5.2/ref/models/options/#django.db.models.Options.db_table\" title=\"django.db.models.Options.db_table\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">db_table</span></code></a> パラメータでテーブル名を上書きする場合に考慮すべき点です。</p>\n</section>\n<section id=\"savepoints\">\n<h3>セーブポイント<a class=\"heading-anchor\" href=\"#savepoints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django ORM と MySQL (InnoDB <a class=\"reference internal\" href=\"#mysql-storage-engines\"><span class=\"std std-ref\">ストレージエンジン</span></a> を使う場合) はどちらも、データベース <a class=\"reference internal\" href=\"/ja/5.2/topics/db/transactions/#topics-db-transactions-savepoints\"><span class=\"std std-ref\">セーブポイント</span></a> をサポートしています。</p>\n<p>MyISAM ストレージエンジンを使用している場合、 <a class=\"reference internal\" href=\"/ja/5.2/topics/db/transactions/#topics-db-transactions-savepoints\"><span class=\"std std-ref\">トランザクション API のセーブポイント関連メソッド</span></a> を使おとすると、データベース由来のエラーが発生することに注意してください。これは、MySQL データベース/テーブルのストレージエンジンを検出するのは高コストな操作であるため、このような検出結果に基づいてこれらのメソッドを何もしない関数に動的に変換する価値はないと判断されるためです。</p>\n</section>\n<section id=\"notes-on-specific-fields\">\n<h3>特定のフィールドに関する注意事項<a class=\"heading-anchor\" href=\"#notes-on-specific-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"character-fields\">\n<span id=\"mysql-character-fields\"></span><h4>文字 (Char) フィールド<a class=\"heading-anchor\" href=\"#character-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>フィールドに <code class=\"docutils literal notranslate\"><span class=\"pre\">unique=True</span></code> を使用している場合、カラムタイプが <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> で格納されているフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> が 255 文字に制限される可能性があります。これは <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>, <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SlugField</span></code></a> に影響します。詳細は <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/create-index.html#create-index-column-prefixes\">the MySQL documentation</a> を参照してください。</p>\n</section>\n<section id=\"textfield-limitations\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> の制限<a class=\"heading-anchor\" href=\"#textfield-limitations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>MySQL は <code class=\"docutils literal notranslate\"><span class=\"pre\">BLOB</span></code> または <code class=\"docutils literal notranslate\"><span class=\"pre\">TEXT</span></code> カラムの最初の N 文字だけをインデックス化できます。 <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> は定義された長さを持たないので、 <code class=\"docutils literal notranslate\"><span class=\"pre\">unique=True</span></code> としてマークすることはできません。MySQL は次のように報告します： &quot;BLOB/TEXT column '&lt;db_column&gt;' used in key specification without a key length&quot; 。</p>\n</section>\n<section id=\"fractional-seconds-support-for-time-and-datetime-fields\">\n<span id=\"mysql-fractional-seconds\"></span><h4>Time および DateTime フィールドの 1 秒単位未満の時間のサポート<a class=\"heading-anchor\" href=\"#fractional-seconds-support-for-time-and-datetime-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>MySQL では、カラム定義に端数表示 (例: <code class=\"docutils literal notranslate\"><span class=\"pre\">DATETIME(6)</span></code>) が含まれていれば、秒未満の端数を格納できます。</p>\n<p>Django は、データベースサーバがサポートしている場合、既存のカラムを秒未満の端数を含むようにアップグレードしません。既存のデータベースで秒未満のカラムを有効にしたい場合は、以下のようなコマンドを実行して、手動で対象のデータベースのカラムを更新する必要があります：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">ALTER</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">your_table</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"k\">MODIFY</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">your_datetime_column</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"n\">DATETIME</span><span class=\"p\">(</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>または <a class=\"reference internal\" href=\"/ja/5.2/topics/migrations/#data-migrations\"><span class=\"std std-ref\">データマイグレーション</span></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\"><span class=\"pre\">RunSQL</span></code></a> オペレーションを使用します。</p>\n</section>\n<section id=\"timestamp-columns\">\n<h4><code class=\"docutils literal notranslate\"><span class=\"pre\">TIMESTAMP</span></code> カラム<a class=\"heading-anchor\" href=\"#timestamp-columns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>もし <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMESTAMP</span></code> カラムを含むレガシーデータベースを使用している場合、データの破損を避けるために、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code></a> を設定する必要があります。<a class=\"reference internal\" href=\"/ja/5.2/ref/django-admin/#django-admin-inspectdb\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">inspectdb</span></code></a> はこれらのカラムを <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> にマッピングし、タイムゾーンサポートを有効にすると、MySQLとDjangoの両方が値をUTCからローカル時間に変換しようと試みます。</p>\n</section>\n</section>\n<section id=\"row-locking-with-queryset-select-for-update\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.select_for_update()</span></code> による行のロック<a class=\"heading-anchor\" href=\"#row-locking-with-queryset-select-for-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL と MariaDB は <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> 文のいくつかのオプションをサポートしていません。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> がサポートされていないオプションで使用された場合、 <a class=\"reference internal\" href=\"/ja/5.2/ref/exceptions/#django.db.NotSupportedError\" title=\"django.db.NotSupportedError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotSupportedError</span></code></a> が発生します。</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>オプション</p></th>\n<th class=\"head\"><p>MariaDB</p></th>\n<th class=\"head\"><p>MySQL</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SKIP</span> <span class=\"pre\">LOCKED</span></code></p></td>\n<td><p>X (≥10.6)</p></td>\n<td><p>X</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">NOWAIT</span></code></p></td>\n<td><p>X</p></td>\n<td><p>X</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">OF</span></code></p></td>\n<td></td>\n<td><p>X</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">NO</span> <span class=\"pre\">KEY</span></code></p></td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>MySQL で <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> を使用する場合は、少なくともユニーク制約に含まれるフィールドのセットに対してクエリセットをフィルタリングするか、インデックスがカバーするフィールドに対してだけフィルタリングするようにしてください。そうしないと、トランザクションの間、テーブル全体に対して排他的書き込みロックがかかります。</p>\n</section>\n<section id=\"automatic-typecasting-can-cause-unexpected-results\">\n<h3>自動型キャストは予期せぬ結果を引き起こすことがあります<a class=\"heading-anchor\" href=\"#automatic-typecasting-can-cause-unexpected-results\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>文字列型で整数値のクエリを実行する場合、MySQL はテーブル内のすべての値の型を整数に強制的に変換してから比較を実行します。テーブルに <code class=\"docutils literal notranslate\"><span class=\"pre\">'abc'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'def'</span></code> という値があり、<code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span> <span class=\"pre\">mycolumn=0</span></code> というクエリを実行した場合、両方の行がマッチします。同様に、<code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span> <span class=\"pre\">mycolumn=1</span></code> は値 <code class=\"docutils literal notranslate\"><span class=\"pre\">'abc1'</span></code> にマッチします。したがって、 Django の文字列型フィールドは、クエリで使う前に必ず値を文字列にキャストします。</p>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> を直接継承したカスタムモデルフィールドを実装したり、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a> をオーバーライドしたり、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code></a>、 <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a>、 <a class=\"reference internal\" href=\"/ja/5.2/topics/db/sql/#django.db.models.Manager.raw\" title=\"django.db.models.Manager.raw\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">raw()</span></code></a> をオーバーライドする場合は、適切な型キャストを行う必要があります。</p>\n</section>\n</section>\n<section id=\"sqlite-notes\">\n<span id=\"id10\"></span><h2>SQLite に関するノート<a class=\"heading-anchor\" href=\"#sqlite-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は SQLite 3.31.0 以上をサポートします。</p>\n<p><a class=\"reference external\" href=\"https://www.sqlite.org/\">SQLite</a> は、主に読み取り専用であったり、より小さなインストール容量を必要とするアプリケーションのための優れた開発代替手段を提供します。しかし、すべてのデータベースサーバと同様に、SQLite 固有の注意すべき違いがいくつかあります。</p>\n<section id=\"substring-matching-and-case-sensitivity\">\n<span id=\"sqlite-string-matching\"></span><h3>部分文字列のマッチングと大文字と小文字の区別<a class=\"heading-anchor\" href=\"#substring-matching-and-case-sensitivity\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>すべての SQLite バージョンにおいて、特定の種類の文字列を照合しようとした際に、やや直感に反する動作をします。これは、クエリセットで <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">iexact</span></code></a> や <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#std-fieldlookup-contains\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">contains</span></code></a> フィルターを使用した場合に発生します。この動作は、次の二つのケースに分かれます。</p>\n<p>1. For substring matching, all matches are done case-insensitively. That is a\nfilter such as <code class=\"docutils literal notranslate\"><span class=\"pre\">filter(name__contains=&quot;aa&quot;)</span></code> will match a name of <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Aabb&quot;</span></code>.</p>\n<p>2. For strings containing characters outside the ASCII range, all exact string\nmatches are performed case-sensitively, even when the case-insensitive options\nare passed into the query. So the <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">iexact</span></code></a> filter will behave exactly\nthe same as the <a class=\"reference internal\" href=\"/ja/5.2/ref/models/querysets/#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">exact</span></code></a> filter in these cases.</p>\n<p>この回避策はドキュメント化されています <a class=\"reference external\" href=\"https://www.sqlite.org/faq.html#q18\">documented at sqlite.org</a> が、Django のデフォルトの SQLite バックエンドでは利用されていません。それらを堅牢に組み込むのはかなり難しいからです。そのため、Django はデフォルトの SQLite の動作を踏襲しており、大文字小文字を区別しないフィルタリングや部分文字列フィルタリングを行う際には、このことを意識する必要があります。</p>\n</section>\n<section id=\"decimal-handling\">\n<span id=\"sqlite-decimal-handling\"></span><h3>10進数 (Decimal) の扱い<a class=\"heading-anchor\" href=\"#decimal-handling\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLiteには本物の10進数の内部型はありません。 <a class=\"reference external\" href=\"https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes\">SQLite datatypes documentation</a> で説明されているように、10進数の値は内部的に <code class=\"docutils literal notranslate\"><span class=\"pre\">REAL</span></code> データ型 (8バイトの IEEE 浮動小数点数) に変換されます。</p>\n</section>\n<section id=\"database-is-locked-errors\">\n<h3>&quot;Database is locked&quot; エラー<a class=\"heading-anchor\" href=\"#database-is-locked-errors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLite は軽量なデータベースであるため、高い並行性をサポートすることはできません。 <code class=\"docutils literal notranslate\"><span class=\"pre\">OperationalError:</span> <span class=\"pre\">database</span> <span class=\"pre\">is</span> <span class=\"pre\">locked</span></code> のエラーは、アプリケーションがデフォルト設定の <code class=\"docutils literal notranslate\"><span class=\"pre\">sqlite</span></code> で扱える以上の同時実行を試行していることを示しています。このエラーは、あるスレッドまたはプロセスがデータベース接続を排他的にロックし、別のスレッドがロックが解除されるのを待ってタイムアウトしたことを意味します。</p>\n<p>Python の SQLite ラッパーにはデフォルトのタイムアウト値があり、2番目のスレッドがタイムアウトして <code class=\"docutils literal notranslate\"><span class=\"pre\">OperationalError:</span> <span class=\"pre\">database</span> <span class=\"pre\">is</span> <span class=\"pre\">locked</span></code> というエラーを発生させるまでに、どれだけの時間ロックを待つことができるかを決めます。</p>\n<p>このエラーが発生した場合は、次の方法で解決できます：</p>\n<ul>\n<li><p>他のデータベース・バックエンドに乗り換えることです。ある段階でSQLiteは実世界のアプリケーションには &quot;軽すぎる &quot;ようになり、この種の同時実行エラーはその段階に達していることを示しています。</p></li>\n<li><p>並行処理を減らし、データベーストランザクションが短時間で終了するようにコードを書き換えます。</p></li>\n<li><p>データベースオプションの <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></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=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;timeout&quot;</span><span class=\"p\">:</span> <span class=\"mi\">20</span><span class=\"p\">,</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>これはSQLiteが &quot;データベースがロックされています&quot; エラーを発生させるまで少し待機させます。解決するために何かするわけではありません。</p>\n</li>\n</ul>\n<section id=\"transactions-behavior\">\n<span id=\"sqlite-transaction-behavior\"></span><h4>トランザクションの動作<a class=\"heading-anchor\" href=\"#transactions-behavior\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<aside class=\"version-note version-added\" data-version=\"5.1\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<p>SQLite は <code class=\"docutils literal notranslate\"><span class=\"pre\">DEFERRED</span></code>、<code class=\"docutils literal notranslate\"><span class=\"pre\">IMMEDIATE</span></code>、および <code class=\"docutils literal notranslate\"><span class=\"pre\">EXCLUSIVE</span></code> の3 種類のトランザクションモードをサポートしています。</p>\n<p>デフォルトは <code class=\"docutils literal notranslate\"><span class=\"pre\">DEFERRED</span></code> です。異なるモードを使用する必要がある場合は、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> のデータベース設定内の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分で設定します。例えば、次のように設定できます：</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=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;transaction_mode&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;IMMEDIATE&quot;</span><span class=\"p\">,</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>トランザクションが <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code> の時間が経過するまで待機し、 &quot;Database is Locked&quot; エラーを発生させないようにするには、トランザクションモードを <code class=\"docutils literal notranslate\"><span class=\"pre\">IMMEDIATE</span></code> に変更してください。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">IMMEDIATE</span></code> および <code class=\"docutils literal notranslate\"><span class=\"pre\">EXCLUSIVE</span></code> モードで最良のパフォーマンスを得るためには、トランザクションはできるだけ短くする必要があります。すべてのビューでこれを保証するのは難しい場合があるため、この場合、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE-ATOMIC_REQUESTS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">ATOMIC_REQUESTS</span></code></a> の使用は推奨されません。</p>\n<p>詳細については、<a class=\"reference external\" href=\"https://www.sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions\">Transactions in SQLite</a> を参照してください。</p>\n</section>\n</section>\n<section id=\"queryset-select-for-update-not-supported\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.select_for_update()</span></code> はサポートされていません。<a class=\"heading-anchor\" href=\"#queryset-select-for-update-not-supported\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLite は <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code> 構文をサポートしていません。これを呼び出しても何も起こりません。</p>\n</section>\n<section id=\"isolation-when-using-queryset-iterator\">\n<span id=\"sqlite-isolation\"></span><h3><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.iterator()</span></code> を使用する際の分離の問題<a class=\"heading-anchor\" href=\"#isolation-when-using-queryset-iterator\"><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/models/querysets/#django.db.models.query.QuerySet.iterator\" title=\"django.db.models.query.QuerySet.iterator\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.iterator()</span></code></a> を使用してテーブルをイテレートしながらテーブルを変更する場合、 <a class=\"reference external\" href=\"https://www.sqlite.org/isolation.html\">Isolation In SQLite</a> で説明されている特別な注意点があります。ループ内で行が追加、変更、削除された場合、その行はイテレータからフェッチされた後続の結果に現れるかもしれませんし、現れないかもしれません。コード内でこれを処理する必要があります。</p>\n</section>\n<section id=\"enabling-json1-extension-on-sqlite\">\n<span id=\"sqlite-json1\"></span><h3>SQLite で JSON1 拡張機能を有効にする<a class=\"heading-anchor\" href=\"#enabling-json1-extension-on-sqlite\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLite で <a class=\"reference internal\" href=\"/ja/5.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a> を使うには、Python の <a class=\"reference external\" href=\"https://docs.python.org/3/library/sqlite3.html#module-sqlite3\" title=\"(in Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">sqlite3</span></code></a> ライブラリで <a class=\"reference external\" href=\"https://www.sqlite.org/json1.html\">JSON1 extension</a> を有効にする必要があります。拡張機能が有効になっていない場合、システムエラー (<code class=\"docutils literal notranslate\"><span class=\"pre\">fields.E180</span></code>) が発生します。</p>\n<p>JSON1 拡張機能を有効にするには、 <a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/JSON1Extension\">the wiki page</a> の手順に従ってください。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>JSON1 拡張機能は SQLite 3.38+ ではデフォルトで有効になっています。</p>\n</aside>\n</section>\n<section id=\"setting-pragma-options\">\n<span id=\"sqlite-init-command\"></span><h3>PRAGMA オプションを設定する<a class=\"heading-anchor\" href=\"#setting-pragma-options\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.1\">\n<p class=\"version-note-title\">New in Django 5.1</p></aside>\n<p><a class=\"reference external\" href=\"https://www.sqlite.org/pragma.html\">Pragma options</a> は、接続時に <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> のデータベース設定内の <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> 部分で <code class=\"docutils literal notranslate\"><span class=\"pre\">init_command</span></code> を使用して設定できます。以下の例では、同期書き込みの耐久性を強化し、<code class=\"docutils literal notranslate\"><span class=\"pre\">cache_size</span></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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.sqlite3&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;init_command&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;PRAGMA synchronous=3; PRAGMA cache_size=2000;&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"oracle-notes\">\n<span id=\"id12\"></span><h2>Oracle に関するノート<a class=\"heading-anchor\" href=\"#oracle-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django は <a class=\"reference external\" href=\"https://www.oracle.com/\">Oracle Database Server</a> バージョン 19c 以降をサポートしています。バージョン 2.3.0 以上の <a class=\"reference external\" href=\"https://oracle.github.io/python-oracledb/\">oracledb</a> Python ドライバが必要です。</p>\n<aside class=\"version-note version-deprecated\" data-version=\"5.0\">\n<p class=\"version-note-title\">Deprecated since Django 5.0</p><p><span class=\"versionmodified deprecated\">バージョン 5.0 で非推奨: </span><code class=\"docutils literal notranslate\"><span class=\"pre\">cx_Oracle</span></code> のサポートは非推奨になりました。</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> コマンドを動作させるには、Oracleデータベースユーザーが以下のコマンドを実行する権限を持っている必要があります：</p>\n<ul class=\"simple\">\n<li><p>CREATE TABLE</p></li>\n<li><p>CREATE SEQUENCE</p></li>\n<li><p>CREATE PROCEDURE</p></li>\n<li><p>CREATE TRIGGER</p></li>\n</ul>\n<p>プロジェクトのテスト・スイートを実行するには、通常、ユーザーはこれらの <em>追加</em> 権限を必要とします：</p>\n<ul class=\"simple\">\n<li><p>CREATE USER</p></li>\n<li><p>ALTER USER</p></li>\n<li><p>DROP USER</p></li>\n<li><p>CREATE TABLESPACE</p></li>\n<li><p>DROP TABLESPACE</p></li>\n<li><p>CREATE SESSION WITH ADMIN OPTION</p></li>\n<li><p>CREATE TABLE WITH ADMIN OPTION</p></li>\n<li><p>CREATE SEQUENCE WITH ADMIN OPTION</p></li>\n<li><p>CREATE PROCEDURE WITH ADMIN OPTION</p></li>\n<li><p>CREATE TRIGGER WITH ADMIN OPTION</p></li>\n</ul>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">RESOURCE</span></code> ロールは <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">SEQUENCE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">PROCEDURE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TRIGGER</span></code> の権限を持っており、<code class=\"docutils literal notranslate\"><span class=\"pre\">RESOURCE</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> を与えられたユーザは <code class=\"docutils literal notranslate\"><span class=\"pre\">RESOURCE</span></code> を与えることができますが、個々の権限 (例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code>) を与えることはできません。そのため、<code class=\"docutils literal notranslate\"><span class=\"pre\">RESOURCE</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> は通常テストの実行には十分ではありません。</p>\n<p>これらを実行するには、ユーザは <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">VIEW</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">MATERIALIZED</span> <span class=\"pre\">VIEW</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> 権限も必要です。特に、これは Django 自身のテストスイートに必要です。</p>\n<p>これらの権限はすべて DBA ロールに含まれており、プライベートな開発者のデータベースで使用するのに適しています。</p>\n<p>Oracle データベースのバックエンドは <code class=\"docutils literal notranslate\"><span class=\"pre\">SYS.DBMS_LOB</span></code> パッケージと <code class=\"docutils literal notranslate\"><span class=\"pre\">SYS.DBMS_RANDOM</span></code> パッケージを使用しているので、ユーザーには実行パーミッションが必要です。通常はデフォルトですべてのユーザーがアクセス可能ですが、そうでない場合は以下のようにパーミッションを付与する必要があります：</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</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=\"SQL code\"><code><span class=\"k\">GRANT</span><span class=\"w\"> </span><span class=\"k\">EXECUTE</span><span class=\"w\"> </span><span class=\"k\">ON</span><span class=\"w\"> </span><span class=\"n\">SYS</span><span class=\"p\">.</span><span class=\"n\">DBMS_LOB</span><span class=\"w\"> </span><span class=\"k\">TO</span><span class=\"w\"> </span><span class=\"k\">user</span><span class=\"p\">;</span>\n<span class=\"k\">GRANT</span><span class=\"w\"> </span><span class=\"k\">EXECUTE</span><span class=\"w\"> </span><span class=\"k\">ON</span><span class=\"w\"> </span><span class=\"n\">SYS</span><span class=\"p\">.</span><span class=\"n\">DBMS_RANDOM</span><span class=\"w\"> </span><span class=\"k\">TO</span><span class=\"w\"> </span><span class=\"k\">user</span><span class=\"p\">;</span>\n</code></pre></div>\n<section id=\"id13\">\n<h3>データベースに接続する<a class=\"heading-anchor\" href=\"#id13\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Oracle データベースのサービス名を使用して接続するには、<code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.oracle&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;xe&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_password&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PORT&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&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-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> と <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a> の両方を空のままにします。しかし、<code class=\"docutils literal notranslate\"><span class=\"pre\">tnsnames.ora</span></code> ファイルや同様の命名メソッドを使用せず、SID（この例では &quot;xe&quot;）を使用して接続したい場合は、次のように <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> と <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a> の両方を入力します：</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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.oracle&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;xe&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_password&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;dbprod01ned.mycompany.com&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PORT&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1540&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-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> と <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a> の両方を指定するか、両方を空文字列のままにしてください。Django はその選択によって異なる接続記述子を使います。</p>\n<section id=\"full-dsn-and-easy-connect\">\n<h4>Full DSN と Easy Connect<a class=\"heading-anchor\" href=\"#full-dsn-and-easy-connect\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p><a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> と <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a> の両方が空の場合、<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> に Full DSN または Easy Connect 文字列を使用できます。このフォーマットは、例えば <code class=\"docutils literal notranslate\"><span class=\"pre\">tnsnames.ora</span></code> のない RAC やプラガブル (pluggable) なデータベースを使用する場合に必要です。</p>\n<p>Easy Connect 文字列の例：</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=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;localhost:1521/orclpdb1&quot;</span>\n</code></pre></div>\n<p>Full DSN 文字列の例：</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=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n    <span class=\"s2\">&quot;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))&quot;</span>\n    <span class=\"s2\">&quot;(CONNECT_DATA=(SERVICE_NAME=orclpdb1)))&quot;</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"oracle-pool\">\n<span id=\"id14\"></span><h3>接続プール<a class=\"heading-anchor\" href=\"#oracle-pool\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.2\">\n<p class=\"version-note-title\">New in Django 5.2</p></aside>\n<p>To use a connection pool with <a class=\"reference external\" href=\"https://oracle.github.io/python-oracledb/\">oracledb</a>, set <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pool&quot;</span></code> to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> in the\n<a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> part of your database configuration. This uses the driver's\n<a class=\"reference external\" href=\"https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#connection-pooling\">create_pool()</a> default values:</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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.oracle&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;pool&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>ドライバの <a class=\"reference external\" href=\"https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#connection-pooling\">create_pool()</a> 関数にカスタムパラメータを渡したい場合は、代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;pool&quot;</span></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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.oracle&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;pool&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n                <span class=\"s2\">&quot;min&quot;</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">,</span>\n                <span class=\"s2\">&quot;max&quot;</span><span class=\"p\">:</span> <span class=\"mi\">10</span><span class=\"p\">,</span>\n                <span class=\"c1\"># ...</span>\n            <span class=\"p\">}</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"threaded-option\">\n<h3>スレッド (threaded) オプション<a class=\"heading-anchor\" href=\"#threaded-option\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django をマルチスレッド環境 (例えば、最近のオペレーティングシステムでデフォルトの MPM モジュールを使った Apache など) で動作させたい場合は、 Oracle データベースの設定の <code class=\"docutils literal notranslate\"><span class=\"pre\">threaded</span></code> オプションを <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></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=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;threaded&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>これを行わないと、クラッシュその他の異常な動作が発生する可能性があります。</p>\n</section>\n<section id=\"insert-returning-into\">\n<h3>INSERT ... RETURNING INTO<a class=\"heading-anchor\" href=\"#insert-returning-into\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>デフォルトでは、Oracle バックエンドは新しい行を挿入するときに <code class=\"docutils literal notranslate\"><span class=\"pre\">AutoField</span></code> の値を効率的に取得するために <code class=\"docutils literal notranslate\"><span class=\"pre\">RETURNING</span> <span class=\"pre\">INTO</span></code> 句を使用します。 この動作は、リモートテーブルへの挿入や <code class=\"docutils literal notranslate\"><span class=\"pre\">INSTEAD</span> <span class=\"pre\">OF</span></code> トリガを使用したビューへの挿入など、特殊なセットアップの場合に <code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseError</span></code> を引き起こす可能性があります。 <code class=\"docutils literal notranslate\"><span class=\"pre\">RETURNING</span> <span class=\"pre\">INTO</span></code> 句は、データベース設定の <code class=\"docutils literal notranslate\"><span class=\"pre\">use_returning_into</span></code> オプションを <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></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=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;use_returning_into&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>この場合、Oracle バックエンドは個別の <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> クエリを使って <code class=\"docutils literal notranslate\"><span class=\"pre\">AutoField</span></code> の値を取得します。</p>\n</section>\n<section id=\"naming-issues\">\n<h3>命名に関する問題<a class=\"heading-anchor\" href=\"#naming-issues\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Oracle では、名前の長さに 30 文字という制限があります。これに対応するため、バックエンドはデータベース識別子を適当な長さに切り詰め、切り詰めた名前の最後の4文字を繰り返し使用可能なMD5ハッシュ値に置き換えます。さらに、バックエンドはデータベース識別子をすべて大文字にします。</p>\n<p>このような変換を防ぐには（通常、レガシーデータベースを扱う場合や、他のユーザーのテーブルにアクセスする場合にのみ必要です）、<code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></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=\"w\"> </span><span class=\"nc\">LegacyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&quot;name_left_in_lowercase&quot;&#39;</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ForeignModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&quot;OTHER_USER&quot;.&quot;NAME_ONLY_SEEMS_OVER_30&quot;&#39;</span>\n</code></pre></div>\n<p>引用符で囲まれた名前は、Django がサポートしている Oracle 以外の他のデータベースバックエンドでも使用できます。ただし、引用符には効果がありません。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code> を実行すると、特定の Oracle キーワードがモデルフィールド名や <code class=\"docutils literal notranslate\"><span class=\"pre\">db_column</span></code> オプションの値として使われた場合に、 <code class=\"docutils literal notranslate\"><span class=\"pre\">ORA-06552</span></code> エラーが発生することがあります。 Django はクエリで使われる全ての識別子を引用符で囲むことで、このような問題のほとんどを 防ぎますが、Oracle のデータ型がカラム名として使われると、このエラーが発生する可能性が あります。 特に、フィールド名として <code class=\"docutils literal notranslate\"><span class=\"pre\">date</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">timestamp</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code> を使わないように注意してください。</p>\n</section>\n<section id=\"null-and-empty-strings\">\n<span id=\"oracle-null-empty-strings\"></span><h3>NULL と空の文字列<a class=\"heading-anchor\" href=\"#null-and-empty-strings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django は通常、 <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> よりも空文字列 (<code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code>) を好んで使いますが、 Oracle はどちらも同じように扱います。これを回避するために、 Oracle バックエンドは、空の文字列を値とするフィールドの明示的な <code class=\"docutils literal notranslate\"><span class=\"pre\">null</span></code> オプションを無視し、 <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code> であるかのように DDL を生成します。データベースから取得する際、これらのフィールドの <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> 値は本当に空の文字列を意味すると仮定され、この仮定を反映するようにデータは静かに変換されます。</p>\n</section>\n<section id=\"id15\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> の制限<a class=\"heading-anchor\" href=\"#id15\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Oracle バックエンドでは、それぞれの <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> を <code class=\"docutils literal notranslate\"><span class=\"pre\">NCLOB</span></code> カラムとして保存します。一般に、Oracle はこのような LOB カラムの使用にいくつかの制限を課しています。</p>\n<ul class=\"simple\">\n<li><p>LOBカラムは主キーとして使用できません。</p></li>\n<li><p>LOB 列はインデックスでは使用できません。</p></li>\n<li><p>LOB 列は <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span></code> リストでは使用できません。つまり、Oracle に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> 列を含むモデルで <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.distinct</span></code> メソッドを使用すると、<code class=\"docutils literal notranslate\"><span class=\"pre\">ORA-00932</span></code> エラーが発生します。回避策として、 <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.defer</span></code> メソッドと <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> を併用して、 <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> 列が <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span></code> リストに含まれないようにしてください。</p></li>\n</ul>\n</section>\n</section>\n<section id=\"subclassing-the-built-in-database-backends\">\n<span id=\"subclassing-database-backends\"></span><h2>組み込みデータベース・バックエンドをサブクラス化する<a class=\"heading-anchor\" href=\"#subclassing-the-built-in-database-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django には組み込みのデータベースバックエンドが付属しています。既存のデータベースバックエンドをサブクラス化して、その動作や機能、設定を変更できます。</p>\n<p>たとえば、データベースの機能を一つだけ変更する必要があるとします。まず、<code class=\"docutils literal notranslate\"><span class=\"pre\">base</span></code> モジュールを含む新しいディレクトリを作成します。たとえば：</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>mysite/\n    ...\n    mydbengine/\n        __init__.py\n        base.py\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">base.py</span></code> モジュールには、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends</span></code> モジュールの既存のエンジンをサブクラス化した <code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseWrapper</span></code> というクラスを含める必要があります。以下は、PostgreSQL エンジンをサブクラス化して <code class=\"docutils literal notranslate\"><span class=\"pre\">allows_group_by_selected_pks_on_model</span></code> という機能を変更する例です：</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/mydbengine/base.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.backends.postgresql</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">base</span><span class=\"p\">,</span> <span class=\"n\">features</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DatabaseFeatures</span><span class=\"p\">(</span><span class=\"n\">features</span><span class=\"o\">.</span><span class=\"n\">DatabaseFeatures</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allows_group_by_selected_pks_on_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DatabaseWrapper</span><span class=\"p\">(</span><span class=\"n\">base</span><span class=\"o\">.</span><span class=\"n\">DatabaseWrapper</span><span class=\"p\">):</span>\n    <span class=\"n\">features_class</span> <span class=\"o\">=</span> <span class=\"n\">DatabaseFeatures</span>\n</code></pre></figure>\n<p>最後に、<code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> ファイルで <a class=\"reference internal\" href=\"/ja/5.2/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASE-ENGINE</span></code></a> を指定する必要があります：</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=\"n\">DATABASES</span> <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;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mydbengine&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>現在のデータベースエンジンのリストは <a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/5.2.x/django/db/backends\">django/db/backends</a> で見ることができます。</p>\n</section>\n<section id=\"using-a-3rd-party-database-backend\">\n<span id=\"third-party-notes\"></span><h2>サードパーティのデータベース・バックエンドを使う<a class=\"heading-anchor\" href=\"#using-a-3rd-party-database-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>公式にサポートされているデータベースに加え、サードパーティが提供するバックエンドがあり、Django で他のデータベースを使うことができます：</p>\n<ul class=\"simple\">\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-cockroachdb/\">CockroachDB</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-firebird/\">Firebird</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-google-spanner/\">Google Cloud Spanner</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/mssql-django/\">Microsoft SQL Server</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-mongodb-backend/\">MongoDB</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-snowflake/\">Snowflake</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-tidb/\">TiDB</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-yugabytedb/\">YugabyteDB</a></p></li>\n</ul>\n<p>これらの非公式のバックエンドがサポートする Django のバージョンと ORM の機能は、バックエンドによって大きく異なります。これらの非公式なバックエンドの特定の機能に関する質問や、サポートに関する質問は、各サードパーティプロジェクトが提供するサポートチャンネルに直接問い合わせてください。</p>\n</section>","rootId":"databases","toc":[{"title":"一般的なメモ","anchor":"general-notes","children":[{"title":"持続的 (persistent) な接続","anchor":"persistent-connections","children":[{"title":"接続管理","anchor":"connection-management","children":[]},{"title":"注意事項","anchor":"caveats","children":[]}]},{"title":"エンコーディング","anchor":"encoding","children":[]}]},{"title":"PostgreSQL に関するノート","anchor":"postgresql-notes","children":[{"title":"PostgreSQL の接続設定","anchor":"postgresql-connection-settings","children":[]},{"title":"PostgreSQL の設定を最適化する","anchor":"optimizing-postgresql-s-configuration","children":[]},{"title":"分離レベル (isolation level)","anchor":"isolation-level","children":[]},{"title":"ロール","anchor":"role","children":[]},{"title":"接続プール","anchor":"connection-pool","children":[]},{"title":"サーバーサイド パラメータ バインディング","anchor":"server-side-parameters-binding","children":[]},{"title":"varchar カラムと text カラムのインデックス","anchor":"indexes-for-varchar-and-text-columns","children":[]},{"title":"拡張機能を追加するためのマイグレーション・オペレーション","anchor":"migration-operation-for-adding-extensions","children":[]},{"title":"サーバーサイド・カーソル","anchor":"server-side-cursors","children":[{"title":"トランザクションプールとサーバーサイドカーソル","anchor":"transaction-pooling-and-server-side-cursors","children":[]}]},{"title":"自動インクリメントの主キーの値を手動で指定する","anchor":"manually-specifying-values-of-auto-incrementing-primary-keys","children":[]},{"title":"テストデータベースのテンプレート","anchor":"test-database-templates","children":[]},{"title":"non-durable 設定でテストの実行を高速化する","anchor":"speeding-up-test-execution-with-non-durable-settings","children":[]}]},{"title":"MariaDB に関するノート","anchor":"mariadb-notes","children":[]},{"title":"MySQL に関するノート","anchor":"mysql-notes","children":[{"title":"バージョン サポート","anchor":"version-support","children":[]},{"title":"ストレージ エンジン","anchor":"storage-engines","children":[]},{"title":"MySQL DB API ドライバ","anchor":"mysql-db-api-drivers","children":[{"title":"mysqlclient","anchor":"mysqlclient","children":[]},{"title":"MySQL Connector/Python","anchor":"id8","children":[]}]},{"title":"タイムゾーンの定義","anchor":"time-zone-definitions","children":[]},{"title":"データベースを作成する","anchor":"creating-your-database","children":[{"title":"照合順序 (collation) の設定","anchor":"collation-settings","children":[]}]},{"title":"データベースに接続する","anchor":"connecting-to-the-database","children":[{"title":"sql_mode の設定","anchor":"setting-sql-mode","children":[]},{"title":"分離レベル (isolation level)","anchor":"mysql-isolation-level","children":[]}]},{"title":"テーブルを作成する","anchor":"creating-your-tables","children":[]},{"title":"テーブル名","anchor":"table-names","children":[]},{"title":"セーブポイント","anchor":"savepoints","children":[]},{"title":"特定のフィールドに関する注意事項","anchor":"notes-on-specific-fields","children":[{"title":"文字 (Char) フィールド","anchor":"character-fields","children":[]},{"title":"TextField の制限","anchor":"textfield-limitations","children":[]},{"title":"Time および DateTime フィールドの 1 秒単位未満の時間のサポート","anchor":"fractional-seconds-support-for-time-and-datetime-fields","children":[]},{"title":"TIMESTAMP カラム","anchor":"timestamp-columns","children":[]}]},{"title":"QuerySet.select_for_update() による行のロック","anchor":"row-locking-with-queryset-select-for-update","children":[]},{"title":"自動型キャストは予期せぬ結果を引き起こすことがあります","anchor":"automatic-typecasting-can-cause-unexpected-results","children":[]}]},{"title":"SQLite に関するノート","anchor":"sqlite-notes","children":[{"title":"部分文字列のマッチングと大文字と小文字の区別","anchor":"substring-matching-and-case-sensitivity","children":[]},{"title":"10進数 (Decimal) の扱い","anchor":"decimal-handling","children":[]},{"title":"\"Database is locked\" エラー","anchor":"database-is-locked-errors","children":[{"title":"トランザクションの動作","anchor":"transactions-behavior","children":[]}]},{"title":"QuerySet.select_for_update() はサポートされていません。","anchor":"queryset-select-for-update-not-supported","children":[]},{"title":"QuerySet.iterator() を使用する際の分離の問題","anchor":"isolation-when-using-queryset-iterator","children":[]},{"title":"SQLite で JSON1 拡張機能を有効にする","anchor":"enabling-json1-extension-on-sqlite","children":[]},{"title":"PRAGMA オプションを設定する","anchor":"setting-pragma-options","children":[]}]},{"title":"Oracle に関するノート","anchor":"oracle-notes","children":[{"title":"データベースに接続する","anchor":"id13","children":[{"title":"Full DSN と Easy Connect","anchor":"full-dsn-and-easy-connect","children":[]}]},{"title":"接続プール","anchor":"oracle-pool","children":[]},{"title":"スレッド (threaded) オプション","anchor":"threaded-option","children":[]},{"title":"INSERT ... RETURNING INTO","anchor":"insert-returning-into","children":[]},{"title":"命名に関する問題","anchor":"naming-issues","children":[]},{"title":"NULL と空の文字列","anchor":"null-and-empty-strings","children":[]},{"title":"TextField の制限","anchor":"id15","children":[]}]},{"title":"組み込みデータベース・バックエンドをサブクラス化する","anchor":"subclassing-the-built-in-database-backends","children":[]},{"title":"サードパーティのデータベース・バックエンドを使う","anchor":"using-a-3rd-party-database-backend","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"API リファレンス","url":"/ja/5.2/ref/"}],"prev":{"docname":"ref/csrf","title":"クロスサイトリクエストフォージェリ (CSRF) 対策","url":"/ja/5.2/ref/csrf/"},"next":{"docname":"ref/django-admin","title":"django-admin と manage.py","url":"/ja/5.2/ref/django-admin/"},"formats":{"html":"/ja/5.2/ref/databases/","markdown":"/ja/5.2/ref/databases.md","json":"/ja/5.2/ref/databases.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/databases.txt","official":"https://docs.djangoproject.com/ja/5.2/ref/databases/","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"]}