{"title":"素の SQL 文の実行","version":"3.1","locale":"ja","docname":"topics/db/sql","url":"/ja/3.1/topics/db/sql/","canonical":"https://djangodocs.dev/ja/3.1/topics/db/sql/","summary":"Django gives you two ways of performing raw SQL queries: you can use Manager.raw() to perform raw queries and return model instances , or you can avoid the model…","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 two ways of performing raw SQL queries: you can use\n<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>, or\nyou can 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\">Explore the ORM before using raw SQL!</p>\n<p>The Django ORM provides many tools to express queries without writing raw\nSQL. For example:</p>\n<ul class=\"simple\">\n<li><p>The <a class=\"reference internal\" href=\"/ja/3.1/ref/models/querysets/\"><span class=\"doc\">QuerySet API</span></a> is extensive.</p></li>\n<li><p>You can <a class=\"reference internal\" href=\"/ja/3.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> and <a class=\"reference internal\" href=\"/ja/3.1/topics/db/aggregation/\"><span class=\"doc\">aggregate</span></a> using many built-in <a class=\"reference internal\" href=\"/ja/3.1/ref/models/database-functions/\"><span class=\"doc\">database functions</span></a>. Beyond those, you can create\n<a class=\"reference internal\" href=\"/ja/3.1/ref/models/expressions/\"><span class=\"doc\">custom query expressions</span></a>.</p></li>\n</ul>\n<p>Before using raw SQL, explore <a class=\"reference internal\" href=\"/ja/3.1/topics/db/\"><span class=\"doc\">the ORM</span></a>. Ask on\none of <a class=\"reference internal\" href=\"/ja/3.1/faq/help/\"><span class=\"doc\">the support channels</span></a> to see if the ORM supports\nyour use case.</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\">引数</span></code> を利用する事で任意に設定可能な全てのパラメータは SQL インジェクション攻撃から防御するため適切にエスケープすべきです。詳細は <a class=\"reference internal\" href=\"/ja/3.1/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL インジェクションの防御</span></a> を参照してください。</p>\n</aside>\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\">None</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>This method takes a raw SQL query, executes it, and returns a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.query.RawQuerySet</span></code> instance. This <code class=\"docutils literal notranslate\"><span class=\"pre\">RawQuerySet</span></code> instance\ncan be iterated over like a normal <a class=\"reference internal\" href=\"/ja/3.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> to\nprovide object instances.</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=\"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=\"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=\"s1\">&#39;SELECT * FROM myapp_person&#39;</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=\"go\">John Smith</span>\n<span class=\"go\">Jane Jones</span>\n</code></pre></div>\n<p>This example isn't very exciting -- it's exactly the same as running\n<code class=\"docutils literal notranslate\"><span class=\"pre\">Person.objects.all()</span></code>. However, <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> has a bunch of other options that\nmake it very powerful.</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;アプリのラベル名&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/3.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=\"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=\"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=\"s1\">&#39;SELECT id, first_name, last_name, birth_date FROM myapp_person&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">...</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=\"s1\">&#39;SELECT last_name, birth_date, first_name, id FROM myapp_person&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">...</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=\"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=\"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=\"s1\">&#39;&#39;&#39;SELECT first AS first_name,</span>\n<span class=\"gp\">... </span><span class=\"s1\">                             last AS last_name,</span>\n<span class=\"gp\">... </span><span class=\"s1\">                             bd AS birth_date,</span>\n<span class=\"gp\">... </span><span class=\"s1\">                             pk AS id,</span>\n<span class=\"gp\">... </span><span class=\"s1\">                      FROM some_other_table&#39;&#39;&#39;</span><span class=\"p\">)</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=\"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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">name_map</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;first&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;first_name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;last&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;last_name&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;bd&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;birth_date&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;pk&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;id&#39;</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=\"s1\">&#39;SELECT * FROM some_other_table&#39;</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><code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</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=\"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=\"s1\">&#39;SELECT * FROM myapp_person&#39;</span><span class=\"p\">)[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>しかしながら、そのインデックスの利用と結果の分割はデータベースの領域で行われている訳ではありません。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> オブジェクトがデータベース内に大量に存在する場合、SQL レベルで問い合わせの制限をした方が効果的です:</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=\"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=\"s1\">&#39;SELECT * FROM myapp_person LIMIT 1&#39;</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=\"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=\"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=\"s1\">&#39;SELECT id, first_name FROM myapp_person&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>上記のクエリから得られる <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> オブジェクトは遅延評価されるモデルのインスタンスになります(<a class=\"reference internal\" href=\"/ja/3.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> を参照)。これはクエリから省かれたフィールドが要求に応じて読み出される事を意味します。以下はその例になります:</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=\"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=\"s1\">&#39;SELECT id, first_name FROM myapp_person&#39;</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=\"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>\n<span class=\"go\">John Smith</span>\n<span class=\"go\">Jane Jones</span>\n</code></pre></div>\n<p>外見上は、そのクエリが名前と苗字を両方取得しているように見えます。しかし、この例は実際には 3 つのクエリを発行しています。名前だけが raw() 内のクエリによって取得され -- 苗字は両方とも表示される時点で都度取得されました。</p>\n<p>There is only one field that you can't leave out - the primary key\nfield. Django uses the primary key to identify model instances, so it\nmust always be included in a raw query. A\n<a class=\"reference internal\" href=\"/ja/3.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> exception will be raised if\nyou forget to include the primary key.</p>\n</section>\n<section id=\"adding-annotations\">\n<h3>付加情報の追加<a class=\"heading-anchor\" href=\"#adding-annotations\"><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/functions-datetime.html\">PostgreSQL の age() 関数</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=\"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=\"s1\">&#39;SELECT *, age(birth_date) AS age FROM myapp_person&#39;</span><span class=\"p\">)</span>\n<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\">people</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"si\">%s</span><span class=\"s2\"> is </span><span class=\"si\">%s</span><span class=\"s2\">.&quot;</span> <span class=\"o\">%</span> <span class=\"p\">(</span><span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">first_name</span><span class=\"p\">,</span> <span class=\"n\">p</span><span class=\"o\">.</span><span class=\"n\">age</span><span class=\"p\">))</span>\n<span class=\"go\">John is 37.</span>\n<span class=\"go\">Jane is 42.</span>\n<span class=\"go\">...</span>\n</code></pre></div>\n<p>You can often avoid using raw SQL to compute annotations by instead using a\n<a class=\"reference internal\" href=\"/ja/3.1/ref/models/expressions/#func-expressions\"><span class=\"std std-ref\">Func() expression</span></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=\"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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">lname</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Doe&#39;</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=\"s1\">&#39;SELECT * FROM myapp_person WHERE last_name = </span><span class=\"si\">%s</span><span class=\"s1\">&#39;</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> is a list or dictionary of parameters. You'll use <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code>\nplaceholders in the query string for a list, or <code class=\"docutils literal notranslate\"><span class=\"pre\">%(key)s</span></code>\nplaceholders for a dictionary (where <code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> is replaced by a\ndictionary key), regardless of your database engine. Such placeholders will be\nreplaced with parameters from the <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> argument.</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>Do not use string formatting on raw queries or quote placeholders in your\nSQL strings!</strong></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=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;SELECT * FROM myapp_person WHERE last_name = </span><span class=\"si\">%s</span><span class=\"s1\">&#39;</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>You might also think you should write your query like this (with quotes\naround <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</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=\"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>Don't make either of these mistakes.</strong></p>\n<p>As discussed in <a class=\"reference internal\" href=\"/ja/3.1/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL injectionへの防御</span></a>, using the <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>\nargument and leaving the placeholders unquoted protects you from <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/SQL_injection\">SQL\ninjection attacks</a>, a common exploit where attackers inject arbitrary\nSQL into your database. If you use string interpolation or quote the\nplaceholder, you're at risk for SQL injection.</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<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>To protect against SQL injection, you must not include quotes around the <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code>\nplaceholders in the SQL string.</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/3.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<span class=\"k\">with</span> <span class=\"n\">connections</span><span class=\"p\">[</span><span class=\"s1\">&#39;my_db_alias&#39;</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</code></pre></div>\n<p>デフォルトでは、Python データベース API は返す結果にフィールド名を含まず、つまり``辞書``でなく、<a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></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=\"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=\"s2\">&quot;Return all rows from a cursor as a dict&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>\n        <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>\n        <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    <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<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=\"s2\">&quot;Return all rows from a cursor as a namedtuple&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=\"s1\">&#39;Result&#39;</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>以下はここまで示した三通り方法それぞれの異なる利用例です:</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=\"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/3.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>Calling stored procedures<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>Calls a database stored procedure with the given name. A sequence\n(<code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>) or dictionary (<code class=\"docutils literal notranslate\"><span class=\"pre\">kparams</span></code>) of input parameters may be\nprovided. Most databases don't support <code class=\"docutils literal notranslate\"><span class=\"pre\">kparams</span></code>. Of Django's built-in\nbackends, only Oracle supports it.</p>\n<p>For example, given this stored procedure in an Oracle database:</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>This will call it:</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=\"s1\">&#39;test_procedure&#39;</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"mi\">1</span><span class=\"p\">,</span> <span class=\"s1\">&#39;test&#39;</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":"素のクエリを実行する","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":"付加情報の追加","anchor":"adding-annotations","children":[]},{"title":"raw() にパラメータを渡す","anchor":"passing-parameters-into-raw","children":[]}]},{"title":"独自の SQL を直接実行する","anchor":"executing-custom-sql-directly","children":[{"title":"データベース接続とカーソル","anchor":"connections-and-cursors","children":[{"title":"Calling stored procedures","anchor":"calling-stored-procedures","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/3.1/topics/"},{"docname":"topics/db/index","title":"モデルとデータベース","url":"/ja/3.1/topics/db/"}],"prev":{"docname":"topics/db/managers","title":"マネージャ","url":"/ja/3.1/topics/db/managers/"},"next":{"docname":"topics/db/transactions","title":"データベースのトランザクション","url":"/ja/3.1/topics/db/transactions/"},"formats":{"html":"/ja/3.1/topics/db/sql/","markdown":"/ja/3.1/topics/db/sql.md","json":"/ja/3.1/topics/db/sql.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/topics/db/sql.txt","official":"https://docs.djangoproject.com/ja/3.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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}