{"title":"素の SQL 文の実行","version":"6.1","locale":"ja","docname":"topics/db/sql","url":"/ja/6.1/topics/db/sql/","canonical":"https://djangodocs.dev/ja/6.1/topics/db/sql/","summary":"Django gives you three ways of performing raw SQL queries: you can embed raw SQL fragments into ORM queries using RawSQL (see Raw SQL fragments ), use Manager.raw()…","html":"<h1>素の SQL 文の実行<a class=\"heading-anchor\" href=\"#performing-raw-sql-queries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django gives you three ways of performing raw SQL queries: you can embed raw\nSQL fragments into ORM queries using\n<a class=\"reference internal\" href=\"/ja/6.1/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> (see <a class=\"reference internal\" href=\"#raw-sql-fragments\"><span class=\"std std-ref\">Raw SQL fragments</span></a>),\nuse <a class=\"reference internal\" href=\"#django.db.models.Manager.raw\" title=\"django.db.models.Manager.raw\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Manager.raw()</span></code></a> to <a class=\"reference internal\" href=\"#performing-raw-queries\">perform raw queries and return model instances</a>,\nor avoid the model layer entirely and <a class=\"reference internal\" href=\"#executing-custom-sql-directly\">execute custom SQL directly</a>.</p>\n<aside class=\"admonition-explore-the-orm-before-using-raw-sql admonition\">\n<p class=\"admonition-title\">素のSQLを使う前にORMを調べましょう！</p>\n<p>Django ORM は、素の SQL を書かずにクエリを表現するための多くのツールを提供しています。たとえば、次のようなものです。</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/ja/6.1/ref/models/querysets/\"><span class=\"doc\">QuerySet API</span></a> は広範囲の用途をカバーしています。</p></li>\n<li><p>多くの組み込みの <a class=\"reference internal\" href=\"/ja/6.1/ref/models/database-functions/\"><span class=\"doc\">データベース関数</span></a> を使用して、<a class=\"reference internal\" href=\"/ja/6.1/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">アノテーション</span></code></a> と <a class=\"reference internal\" href=\"/ja/6.1/topics/db/aggregation/\"><span class=\"doc\">集計</span></a> を行うことができます。それらを超えて、<a class=\"reference internal\" href=\"/ja/6.1/ref/models/expressions/\"><span class=\"doc\">独自のクエリ式</span></a> を作成することもできます。</p></li>\n</ul>\n<p>素のSQLを使う前に、 <a class=\"reference internal\" href=\"/ja/6.1/topics/db/\"><span class=\"doc\">ORM</span></a> を調べてください。ORMがあなたのユースケースをサポートしているかどうか、 <a class=\"reference internal\" href=\"/ja/6.1/faq/help/\"><span class=\"doc\">サポートチャンネル</span></a> で尋ねてみてください。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>直接 SQL を書く場合はいつでも十分警戒するべきです。利用者が <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> を利用する事で任意に設定可能な全てのパラメータは必ず、SQL インジェクション攻撃から防御するために適切にエスケープすべきです。詳細は <a class=\"reference internal\" href=\"/ja/6.1/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL インジェクションに対する防御</span></a> を参照してください。</p>\n</aside>\n<section id=\"raw-sql-fragments\">\n<span id=\"id3\"></span><h2>Raw SQL fragments<a class=\"heading-anchor\" href=\"#raw-sql-fragments\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>In some cases, you may need to embed raw SQL fragments directly into ORM\nqueries — for example, in <a class=\"reference internal\" href=\"/ja/6.1/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">annotate()</span></code></a> or\n<a class=\"reference internal\" href=\"/ja/6.1/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a> calls. Use <a class=\"reference internal\" href=\"/ja/6.1/ref/models/expressions/#func-expressions\"><span class=\"std std-ref\">Func()\nexpressions</span></a> for calling database functions across\nbackends, or\n<a class=\"reference internal\" href=\"/ja/6.1/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> for arbitrary parameterized SQL\nfragments.</p>\n</section>\n<section id=\"performing-raw-queries\">\n<span id=\"executing-raw-queries\"></span><h2>素のクエリを実行する<a class=\"heading-anchor\" href=\"#performing-raw-queries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> マネージャメソッドは素の SQL 文を処理してモデルのインスタンスを返させる場合に利用できます:</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.Manager.raw\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">Manager.</span></span><span class=\"sig-name descname\"><span class=\"pre\">raw</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raw_query</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">translations</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.Manager.raw\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>このメソッドは素の SQL クエリを受け取り、実行し、 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.query.RawQuerySet</span></code> インスタンスを返します。この <code class=\"docutils literal notranslate\"><span class=\"pre\">RawQuerySet</span></code> インスタンスは通常の <a class=\"reference internal\" href=\"/ja/6.1/ref/models/querysets/#django.db.models.query.QuerySet\" title=\"django.db.models.query.QuerySet\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code></a> のようにイテレートしてオブジェクトインスタンスを生成できます。</p>\n<p>これは例で説明するのが一番わかりやすいでしょう。次のようなモデルがあるとします:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Person</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=\"n\">first_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n    <span class=\"n\">last_name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n    <span class=\"n\">birth_date</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateField</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>このとき、以下のように独自の SQL を実行できます:</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=\"k\">for</span> <span class=\"n\">p</span> <span class=\"ow\">in</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT * FROM myapp_person&quot;</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">p</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">John Smith</span>\n<span class=\"go\">Jane Jones</span>\n</code></pre></div>\n<p>この例はたいしてエキサイティングではありません。これは <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.objects.all()</span></code> を実行したのと全く同じです。しかしながら、 <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> はその機能を極めて強力なものにする数々のオプションを備えています。</p>\n<aside class=\"admonition-model-table-names admonition\">\n<p class=\"admonition-title\">モデルのテーブル名</p>\n<p>この例で示したモデル <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> のテーブル名はどのようにして得られたのでしょうか？</p>\n<p>デフォルトでは、Django はモデルの &quot;app label&quot; (<code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">startapp</span></code> で使った名前) とモデルのクラス名をアンダースコアでつないで、データベースのテーブル名を決定します。たとえば、<code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> モデルは <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp</span></code> という名前のアプリの中にあると仮定しているので、そのテーブルは <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp_person</span></code> となります。</p>\n<p>詳細に関しては、手動でデータベースのテーブル名を設定できる <a class=\"reference internal\" href=\"/ja/6.1/ref/models/options/#django.db.models.Options.db_table\" title=\"django.db.models.Options.db_table\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_table</span></code></a> オプションのドキュメントを参照してください。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">.raw()</span></code> に対して渡された SQL 文はチェックされません。Django はそこに記述された内容によってデータベースが行を返す事を期待しますが、それを強制する処理は行いません。もし記述したクエリが行を返さない場合、(おそらく不可解な)例外が発生します。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>もしあなたが MySQL でクエリを処理する場合は、複数の型を扱う際に MySQL の暗黙的な型変換が予期しない結果をもたらす場合がある事に注意してください。もし文字列型で定義したカラムに対し、数値型の値で問い合わせた場合、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> という条件での問い合わせを行うと、両方の行がマッチします。これを防ぐため、クエリの値を利用する前に適切な型キャストを行ってください。</p>\n</aside>\n<section id=\"mapping-query-fields-to-model-fields\">\n<h3>クエリのフィールドをモデルのフィールドにマップする<a class=\"heading-anchor\" href=\"#mapping-query-fields-to-model-fields\"><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\">raw()</span></code> は自動的にクエリのフィールドをモデルのフィールドにマップします。</p>\n<p>クエリのフィールドの順番は重要ではありません。つまり、以下のクエリはどちらも同じように動作します:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT id, first_name, last_name, birth_date FROM myapp_person&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT last_name, birth_date, first_name, id FROM myapp_person&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>マッチングは名前によって行われます。つまり、SQL の <code class=\"docutils literal notranslate\"><span class=\"pre\">AS</span></code> 句を使用して、クエリのフィールドをモデルのフィールドにマッピングできます。もし、他のテーブルで <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> のデータがあれば、簡単に <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> のインスタンスにマッピングできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;&quot;&quot;</span>\n<span class=\"gp\">... </span><span class=\"s2\">    SELECT first AS first_name,</span>\n<span class=\"gp\">... </span><span class=\"s2\">           last AS last_name,</span>\n<span class=\"gp\">... </span><span class=\"s2\">           bd AS birth_date,</span>\n<span class=\"gp\">... </span><span class=\"s2\">           pk AS id,</span>\n<span class=\"gp\">... </span><span class=\"s2\">    FROM some_other_table</span>\n<span class=\"gp\">... </span><span class=\"s2\">    &quot;&quot;&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<p>名称が一致している限り、そのモデルのインスタンスは適切に生成されます。</p>\n<p>あるいは、 <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> の引数 <code class=\"docutils literal notranslate\"><span class=\"pre\">translations</span></code> を使って、クエリのフィールドをモデルのフィールドにマッピングすることもできます。これはクエリのフィールド名とモデルのフィールド名をマッピングした辞書です。たとえば、上記のクエリは次のように書くこともできます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">name_map</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s2\">&quot;first&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;first_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;last&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;last_name&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;bd&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;birth_date&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;pk&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;id&quot;</span><span class=\"p\">}</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT * FROM some_other_table&quot;</span><span class=\"p\">,</span> <span class=\"n\">translations</span><span class=\"o\">=</span><span class=\"n\">name_map</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"index-lookups\">\n<h3>インデックスの利用<a class=\"heading-anchor\" href=\"#index-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>raw() はインデックスをサポートしているので、最初の結果だけが必要な場合はこう書きます:</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=\"n\">first_person</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT * FROM myapp_person&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>ただし、インデックス作成とスライスはデータベースレベルでは実行されません。データベースに多数の Person オブジェクトがある場合は、SQL レベルでクエリを制限する方が効率的です:</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=\"n\">first_person</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT * FROM myapp_person LIMIT 1&quot;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n</code></pre></div>\n</section>\n<section id=\"deferring-model-fields\">\n<h3>モデルのフィールドの遅延評価<a class=\"heading-anchor\" href=\"#deferring-model-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>モデルのフィールドは省略可能です:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">people</span> <span class=\"o\">=</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT id, first_name FROM myapp_person&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> objects returned by this query will be deferred model instances\n(see <a class=\"reference internal\" href=\"/ja/6.1/ref/models/querysets/#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a>). This means that the\nfields that are omitted from the query will be loaded on demand. For example:</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=\"k\">for</span> <span class=\"n\">p</span> <span class=\"ow\">in</span> <span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT id, first_name FROM myapp_person&quot;</span><span class=\"p\">):</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">first_name</span><span class=\"p\">,</span>  <span class=\"c1\"># This will be retrieved by the original query</span>\n<span class=\"gp\">... </span>        <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">last_name</span><span class=\"p\">,</span>  <span class=\"c1\"># This will be retrieved on demand</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">John Smith</span>\n<span class=\"go\">Jane Jones</span>\n</code></pre></div>\n<p>見た目上は、そのクエリが名前と苗字を両方取得しているように見えます。しかし、この例は実際には 3 つのクエリを発行しています。名前だけが <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> 内のクエリによって取得され、苗字は両方とも表示される時点でその都度取得されました。</p>\n<p>省略できないフィールドが一つだけあります。主キーのフィールドです。Django はモデルのインスタンスの識別に主キーを利用するので、素のクエリには必ず含む必要があります。もし主キーを入れ忘れると、 <a class=\"reference internal\" href=\"/ja/6.1/ref/exceptions/#django.core.exceptions.FieldDoesNotExist\" title=\"django.core.exceptions.FieldDoesNotExist\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FieldDoesNotExist</span></code></a> 例外が発生します。</p>\n</section>\n<section id=\"passing-parameters-into-raw\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> にパラメータを渡す<a class=\"heading-anchor\" href=\"#passing-parameters-into-raw\"><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\">raw()</span></code> に対して <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 引数を利用できます:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">lname</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;Doe&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT * FROM myapp_person WHERE last_name = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">lname</span><span class=\"p\">])</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> はパラメータのリストもしくは辞書です。リストの場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> というプレースホルダーを使い、辞書の場合は <code class=\"docutils literal notranslate\"><span class=\"pre\">%(key)s</span></code> というプレースホルダーを使います ( <code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> は辞書のキーに置き換えられます)、データベースエンジンを意識する必要はありません。このようなプレースホルダは <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 引数のパラメータに置き換えられます。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>SQLite バックエンドにおいて辞書はサポートされていません。パラメータはリストで渡す必要があります。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p><strong>素のSQLクエリで文字列書式を使用したり、SQL文字列で引用符プレースホルダを使用しないでください。</strong></p>\n<p>上記のクエリをこう書きたくなる誘惑に駆られるでしょう:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;SELECT * FROM myapp_person WHERE last_name = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span> <span class=\"o\">%</span> <span class=\"n\">lname</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Person</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"n\">query</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>また、クエリはこのように書くべきだと思うかもしれません（ <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> を引用符で囲む）:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;SELECT * FROM myapp_person WHERE last_name = &#39;</span><span class=\"si\">%s</span><span class=\"s2\">&#39;&quot;</span>\n</code></pre></div>\n<p><strong>どちらのミスも犯してはなりません。</strong></p>\n<p><a class=\"reference internal\" href=\"/ja/6.1/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL injectionへの防御</span></a> で議論されているように、<code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> 引数を使用し、プレースホルダーを引用符で囲まないことで、攻撃者が任意のSQLをデータベースに注入する、一般的な脆弱性である <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/SQL_injection\">SQL injection attacks</a> から保護されます。文字列補間を使用したり、プレースホルダーを引用符で囲んだりすると、SQLインジェクションのリスクがあります。</p>\n</aside>\n</section>\n</section>\n<section id=\"executing-custom-sql-directly\">\n<span id=\"executing-custom-sql\"></span><h2>独自の SQL を直接実行する<a class=\"heading-anchor\" href=\"#executing-custom-sql-directly\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"#django.db.models.Manager.raw\" title=\"django.db.models.Manager.raw\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">Manager.raw()</span></code></a> でも要求を満たせない場合があります:きれいにモデルにマップできないクエリを扱ったり、<code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>、 <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> あるいは <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code> を直接実行したりする必要が有るかもしれません。</p>\n<p>こういったケースでは、モデル層を完全に迂回してデータベースにいつでも直接アクセスできます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection</span></code> オブジェクトは、デフォルトのデータベースコネクションを表します。データベースコネクションを利用するには、カーソルオブジェクトを取得するため <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.cursor()</span></code> を呼び出してください。そして、<code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.execute(sql,</span> <span class=\"pre\">[params])</span></code> を呼び出して SQL を実行した後、<code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.fetchone()</span></code> もしくは <code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.fetchall()</span></code> が結果の行を返します。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">connection</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_custom_sql</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n    <span class=\"k\">with</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">cursor</span><span class=\"p\">:</span>\n        <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;UPDATE bar SET foo = 1 WHERE baz = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">baz</span><span class=\"p\">])</span>\n        <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT foo FROM bar WHERE baz = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">baz</span><span class=\"p\">])</span>\n        <span class=\"n\">row</span> <span class=\"o\">=</span> <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">fetchone</span><span class=\"p\">()</span>\n\n    <span class=\"k\">return</span> <span class=\"n\">row</span>\n</code></pre></div>\n<p>SQLインジェクションから保護するために、SQL文字列の <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> プレースホルダの前後に引用符を含めてはいけません。</p>\n<p>もしリテラルなパーセント記号をクエリ中で使いたい場合、パラメータを渡す際に二重に記述する必要が有る事に注意してください:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT foo FROM bar WHERE baz = &#39;30%&#39;&quot;</span><span class=\"p\">)</span>\n<span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT foo FROM bar WHERE baz = &#39;30</span><span class=\"si\">%%</span><span class=\"s2\">&#39; AND id = </span><span class=\"si\">%s</span><span class=\"s2\">&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">id</span><span class=\"p\">])</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/6.1/topics/db/multi-db/\"><span class=\"doc\">2 つ以上のデータベース</span></a> を利用している場合、特定のコネクション (とカーソル) を取得するのに <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connections</span></code> を利用できます。<code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connections</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">connections</span>\n\n<span class=\"k\">with</span> <span class=\"n\">connections</span><span class=\"p\">[</span><span class=\"s2\">&quot;my_db_alias&quot;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">cursor</span><span class=\"p\">:</span>\n    <span class=\"c1\"># Your code here</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>デフォルトでは、Python データベース API は返す結果にフィールド名を含まず、つまり <code class=\"docutils literal notranslate\"><span class=\"pre\">辞書</span></code> でなく、 <code class=\"docutils literal notranslate\"><span class=\"pre\">リスト</span></code> の値として結果を返します。処理能力とメモリを少々利用して、次のような処理を用いる事で結果を <code class=\"docutils literal notranslate\"><span class=\"pre\">辞書</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\">def</span><span class=\"w\"> </span><span class=\"nf\">dictfetchall</span><span class=\"p\">(</span><span class=\"n\">cursor</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return all rows from a cursor as a dict.</span>\n<span class=\"sd\">    Assume the column names are unique.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">columns</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">col</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"k\">for</span> <span class=\"n\">col</span> <span class=\"ow\">in</span> <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">description</span><span class=\"p\">]</span>\n    <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"nb\">dict</span><span class=\"p\">(</span><span class=\"nb\">zip</span><span class=\"p\">(</span><span class=\"n\">columns</span><span class=\"p\">,</span> <span class=\"n\">row</span><span class=\"p\">))</span> <span class=\"k\">for</span> <span class=\"n\">row</span> <span class=\"ow\">in</span> <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">fetchall</span><span class=\"p\">()]</span>\n</code></pre></div>\n<p>別の選択肢は Python 標準ライブラリに含まれる <a class=\"reference external\" href=\"https://docs.python.org/3/library/collections.html#collections.namedtuple\" title=\"(in Python v3.14)\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">collections.namedtuple()</span></code></a> を利用する事です。<code class=\"docutils literal notranslate\"><span class=\"pre\">namedtuple</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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">collections</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">namedtuple</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">namedtuplefetchall</span><span class=\"p\">(</span><span class=\"n\">cursor</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    Return all rows from a cursor as a namedtuple.</span>\n<span class=\"sd\">    Assume the column names are unique.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n    <span class=\"n\">desc</span> <span class=\"o\">=</span> <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">description</span>\n    <span class=\"n\">nt_result</span> <span class=\"o\">=</span> <span class=\"n\">namedtuple</span><span class=\"p\">(</span><span class=\"s2\">&quot;Result&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"n\">col</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span> <span class=\"k\">for</span> <span class=\"n\">col</span> <span class=\"ow\">in</span> <span class=\"n\">desc</span><span class=\"p\">])</span>\n    <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">nt_result</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">row</span><span class=\"p\">)</span> <span class=\"k\">for</span> <span class=\"n\">row</span> <span class=\"ow\">in</span> <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">fetchall</span><span class=\"p\">()]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">dictfetchall()</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">namedtuplefetchall()</span></code> の例は、異なるテーブルの列をカーソルは区別できないため、一意な列名を想定しています。</p>\n<p>この3つの違いの例を挙げましょう:</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=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT id, parent_id FROM test LIMIT 2&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">fetchall</span><span class=\"p\">()</span>\n<span class=\"go\">((54360982, None), (54360880, None))</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT id, parent_id FROM test LIMIT 2&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">dictfetchall</span><span class=\"p\">(</span><span class=\"n\">cursor</span><span class=\"p\">)</span>\n<span class=\"go\">[{&#39;parent_id&#39;: None, &#39;id&#39;: 54360982}, {&#39;parent_id&#39;: None, &#39;id&#39;: 54360880}]</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"s2\">&quot;SELECT id, parent_id FROM test LIMIT 2&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">results</span> <span class=\"o\">=</span> <span class=\"n\">namedtuplefetchall</span><span class=\"p\">(</span><span class=\"n\">cursor</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">results</span>\n<span class=\"go\">[Result(id=54360982, parent_id=None), Result(id=54360880, parent_id=None)]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">results</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">id</span>\n<span class=\"go\">54360982</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">results</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">][</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"go\">54360982</span>\n</code></pre></div>\n<section id=\"connections-and-cursors\">\n<h3>コネクションとカーソル<a class=\"heading-anchor\" href=\"#connections-and-cursors\"><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\">connection</span></code> と <code class=\"docutils literal notranslate\"><span class=\"pre\">cursor</span></code> の実装は <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 DB-API の基準にほぼ完全に準拠しています — <a class=\"reference internal\" href=\"/ja/6.1/topics/db/transactions/\"><span class=\"doc\">トランザクション操作</span></a> は例外となります。</p>\n<p>Python DB-API に精通していない場合、<code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.execute()</span></code> 内の SQL 文には直接値を追加せずに、<code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;%s&quot;</span></code> というプレースホルダーを利用する事に注意してください。この手法を用いる事で、内部で動作しているデータベースライブラリは自動的に必要に応じて値のエスケープを行ってくれます。</p>\n<p>加えて Django はプレースホルダーとして Python に内蔵された SQLite モジュールで用いられる <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;?&quot;</span></code> でなく <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;%s&quot;</span></code> を期待して動作する事にも注意してください。これは全体の調和と健全性のためです。</p>\n<p>コンテキストマネージャとしてのカーソルの利用:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">with</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">c</span><span class=\"p\">:</span>\n    <span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これは以下と同じです:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span>\n<span class=\"k\">try</span><span class=\"p\">:</span>\n    <span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"o\">...</span><span class=\"p\">)</span>\n<span class=\"k\">finally</span><span class=\"p\">:</span>\n    <span class=\"n\">c</span><span class=\"o\">.</span><span class=\"n\">close</span><span class=\"p\">()</span>\n</code></pre></div>\n<section id=\"calling-stored-procedures\">\n<h4>ストアドプロシージャの呼び出し<a class=\"heading-anchor\" href=\"#calling-stored-procedures\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.CursorWrapper.callproc\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">CursorWrapper.</span></span><span class=\"sig-name descname\"><span class=\"pre\">callproc</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">procname</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">params</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">kparams</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.CursorWrapper.callproc\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>与えられた名前のストアドプロシージャを呼び出します。入力パラメータのシーケンス (<code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>) または辞書 (<code class=\"docutils literal notranslate\"><span class=\"pre\">kparams</span></code>) を指定できます。ほとんどのデータベースは <code class=\"docutils literal notranslate\"><span class=\"pre\">kparams</span></code> をサポートしていません。Django の組み込みバックエンドでは、 Oracle だけがサポートしています。</p>\n<p>たとえば、Oracleデータベースで次のようなストアドプロシージャがあるとします:</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\">PROCEDURE</span><span class=\"w\"> </span><span class=\"ss\">&quot;TEST_PROCEDURE&quot;</span><span class=\"p\">(</span><span class=\"n\">v_i</span><span class=\"w\"> </span><span class=\"nb\">INTEGER</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">v_text</span><span class=\"w\"> </span><span class=\"n\">NVARCHAR2</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"k\">AS</span>\n<span class=\"w\">    </span><span class=\"n\">p_i</span><span class=\"w\"> </span><span class=\"nb\">INTEGER</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">p_text</span><span class=\"w\"> </span><span class=\"n\">NVARCHAR2</span><span class=\"p\">(</span><span class=\"mi\">10</span><span class=\"p\">);</span>\n<span class=\"k\">BEGIN</span>\n<span class=\"w\">    </span><span class=\"n\">p_i</span><span class=\"w\"> </span><span class=\"p\">:</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">v_i</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"n\">p_text</span><span class=\"w\"> </span><span class=\"p\">:</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">v_text</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"p\">...</span>\n<span class=\"k\">END</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>これは以下のコードで呼び出すことができます。:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">with</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">cursor</span><span class=\"p\">()</span> <span class=\"k\">as</span> <span class=\"n\">cursor</span><span class=\"p\">:</span>\n    <span class=\"n\">cursor</span><span class=\"o\">.</span><span class=\"n\">callproc</span><span class=\"p\">(</span><span class=\"s2\">&quot;test_procedure&quot;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s2\">&quot;test&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n</dd></dl>\n\n</section>\n</section>\n</section>","rootId":"performing-raw-sql-queries","toc":[{"title":"Raw SQL fragments","anchor":"raw-sql-fragments","children":[]},{"title":"素のクエリを実行する","anchor":"performing-raw-queries","children":[{"title":"クエリのフィールドをモデルのフィールドにマップする","anchor":"mapping-query-fields-to-model-fields","children":[]},{"title":"インデックスの利用","anchor":"index-lookups","children":[]},{"title":"モデルのフィールドの遅延評価","anchor":"deferring-model-fields","children":[]},{"title":"raw() にパラメータを渡す","anchor":"passing-parameters-into-raw","children":[]}]},{"title":"独自の SQL を直接実行する","anchor":"executing-custom-sql-directly","children":[{"title":"コネクションとカーソル","anchor":"connections-and-cursors","children":[{"title":"ストアドプロシージャの呼び出し","anchor":"calling-stored-procedures","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/6.1/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/6.1/topics/db/"}],"prev":{"docname":"topics/db/managers","title":"マネージャ","url":"/ja/6.1/topics/db/managers/"},"next":{"docname":"topics/db/transactions","title":"データベースのトランザクション","url":"/ja/6.1/topics/db/transactions/"},"formats":{"html":"/ja/6.1/topics/db/sql/","markdown":"/ja/6.1/topics/db/sql.md","json":"/ja/6.1/topics/db/sql.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/db/sql.txt","official":"https://docs.djangoproject.com/ja/6.1/topics/db/sql/","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"]}