{"title":"Utföra SQL-frågor i råformat","version":"6.1","locale":"sv","docname":"topics/db/sql","url":"/sv/6.1/topics/db/sql/","canonical":"https://djangodocs.dev/sv/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>Utföra SQL-frågor i råformat<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=\"/sv/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\">Utforska ORM innan du använder rå SQL!</p>\n<p>Django ORM tillhandahåller många verktyg för att uttrycka frågor utan att skriva rå SQL. Till exempel:</p>\n<ul class=\"simple\">\n<li><p>Den <a class=\"reference internal\" href=\"/sv/6.1/ref/models/querysets/\"><span class=\"doc\">QuerySet API</span></a> är omfattande.</p></li>\n<li><p>Du kan <a class=\"reference internal\" href=\"/sv/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\">annotera</span></code></a> och <a class=\"reference internal\" href=\"/sv/6.1/topics/db/aggregation/\"><span class=\"doc\">aggregera</span></a> med hjälp av många inbyggda <a class=\"reference internal\" href=\"/sv/6.1/ref/models/database-functions/\"><span class=\"doc\">databasfunktioner</span></a>. Utöver dessa kan du skapa <a class=\"reference internal\" href=\"/sv/6.1/ref/models/expressions/\"><span class=\"doc\">custom query expressions</span></a>.</p></li>\n</ul>\n<p>Innan du använder rå SQL bör du utforska <a class=\"reference internal\" href=\"/sv/6.1/topics/db/\"><span class=\"doc\">ORM</span></a>. Fråga på en av <a class=\"reference internal\" href=\"/sv/6.1/faq/help/\"><span class=\"doc\">supportkanalerna</span></a> för att se om ORM stöder ditt användningsfall.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Du bör vara mycket försiktig när du skriver rå SQL. Varje gång du använder det bör du på rätt sätt undkomma alla parametrar som användaren kan kontrollera genom att använda <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> för att skydda mot SQL-injektionsattacker. Läs gärna mer om <a class=\"reference internal\" href=\"/sv/6.1/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">SQL injection protection</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=\"/sv/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=\"/sv/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=\"/sv/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=\"/sv/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>Utföra råa förfrågningar<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>Hanteringsmetoden <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> kan användas för att utföra råa SQL-frågor som returnerar modellinstanser:</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>Den här metoden tar en rå SQL-fråga, kör den och returnerar en <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.query.RawQuerySet</span></code>-instans. Denna <code class=\"docutils literal notranslate\"><span class=\"pre\">RawQuerySet</span></code>-instans kan itereras över som en normal <a class=\"reference internal\" href=\"/sv/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> för att tillhandahålla objektinstanser.</p>\n<p>Detta illustreras bäst med ett exempel. Anta att du har följande modell:</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>Du kan sedan köra anpassad SQL på följande sätt:</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>Det här exemplet är inte särskilt spännande - det är exakt samma sak som att köra <code class=\"docutils literal notranslate\"><span class=\"pre\">Person.objects.all()</span></code>. Men <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code> har en massa andra alternativ som gör den mycket kraftfull.</p>\n<aside class=\"admonition-model-table-names admonition\">\n<p class=\"admonition-title\">Namn på modelltabeller</p>\n<p>Varifrån kom namnet på tabellen <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> i det exemplet?</p>\n<p>Som standard räknar Django ut ett databastabellnamn genom att ansluta modellens ”appetikett” - det namn du använde i <code class=\"docutils literal notranslate\"><span class=\"pre\">manage.py</span> <span class=\"pre\">startapp</span></code> - till modellens klassnamn, med ett understreck mellan dem. I exemplet har vi antagit att modellen <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code> lever i en app som heter <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp</span></code>, så dess tabell skulle vara <code class=\"docutils literal notranslate\"><span class=\"pre\">myapp_person</span></code>.</p>\n<p>Mer information finns i dokumentationen för alternativet <a class=\"reference internal\" href=\"/sv/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>, där du också kan ange databasens tabellnamn manuellt.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Ingen kontroll görs på SQL-satsen som skickas in till <code class=\"docutils literal notranslate\"><span class=\"pre\">.raw()</span></code>. Django förväntar sig att satsen kommer att returnera en uppsättning rader från databasen, men gör ingenting för att genomdriva det. Om frågan inte returnerar rader, kommer ett (eventuellt kryptiskt) fel att uppstå.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p>Om du utför frågor på MySQL, observera att MySQL: s tysta typcoercion kan orsaka oväntade resultat när du blandar typer. Om du ställer en fråga på en kolumn av strängtyp, men med ett heltalsvärde, kommer MySQL att tvinga typerna för alla värden i tabellen till ett heltal innan jämförelsen utförs. Om din tabell till exempel innehåller värdena <code class=\"docutils literal notranslate\"><span class=\"pre\">'abc'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'def'</span></code> och du frågar efter <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span> <span class=\"pre\">mycolumn=0</span></code>, kommer båda raderna att matcha. För att förhindra detta måste du utföra korrekt typecasting innan du använder värdet i en fråga.</p>\n</aside>\n<section id=\"mapping-query-fields-to-model-fields\">\n<h3>Mappning av frågefält till modellfält<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> mappar automatiskt fält i frågan till fält i modellen.</p>\n<p>Ordningen på fälten i din fråga spelar ingen roll. Med andra ord fungerar båda följande frågor på samma sätt:</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>Matchningen görs med hjälp av namn. Det innebär att du kan använda SQL:s <code class=\"docutils literal notranslate\"><span class=\"pre\">AS</span></code>-klausuler för att mappa fält i frågan till modellfält. Så om du hade någon annan tabell som hade <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code>-data i den, kan du enkelt mappa den till <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code>-instanser:</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>Så länge namnen stämmer överens kommer modellinstanserna att skapas på rätt sätt.</p>\n<p>Alternativt kan du mappa fält i frågan till modellfält med hjälp av argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">translations</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code>. Detta är en ordbok som mappar namn på fält i frågan till namn på fält i modellen. Till exempel kan ovanstående fråga också skrivas:</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>Indexuppslagningar<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> stöder indexering, så om du bara behöver det första resultatet kan du skriva:</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>Indexeringen och skivningen utförs dock inte på databasnivå. Om du har ett stort antal <code class=\"docutils literal notranslate\"><span class=\"pre\">Person</span></code>-objekt i din databas är det mer effektivt att begränsa frågan på SQL-nivå:</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>Uppskjutande av modellfält<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>Fält kan också utelämnas:</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=\"/sv/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>Utåt sett ser det ut som om frågan har hämtat både förnamnet och efternamnet. Men i det här exemplet ställdes faktiskt tre frågor. Endast förnamnen hämtades av <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</span></code>-frågan - efternamnen hämtades båda på begäran när de skrevs ut.</p>\n<p>Det finns bara ett fält som du inte kan utelämna - fältet för primärnyckeln. Django använder primärnyckeln för att identifiera modellinstanser, så den måste alltid inkluderas i en rå fråga. Ett <a class=\"reference internal\" href=\"/sv/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> undantag kommer att uppstå om du glömmer att inkludera den primära nyckeln.</p>\n</section>\n<section id=\"passing-parameters-into-raw\">\n<h3>Överföra parametrar till <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>Om du behöver utföra parametriserade frågor kan du använda argumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> till <code class=\"docutils literal notranslate\"><span class=\"pre\">raw()</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> är en lista eller en ordbok med parametrar. Du använder <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> platshållare i frågesträngen för en lista, eller <code class=\"docutils literal notranslate\"><span class=\"pre\">%(key)s</span></code> platshållare för en ordbok (där <code class=\"docutils literal notranslate\"><span class=\"pre\">key</span></code> ersätts av en ordboksnyckel), oavsett vilken databasmotor du använder. Sådana platshållare kommer att ersättas med parametrar från argumentet <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\">Observera</p>\n<p>Dictionary-parametrar stöds inte med SQLite-backend; med denna backend måste du skicka parametrar som en lista.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Varning</p>\n<p><strong>Använd inte strängformatering på råa frågor eller citattecken i dina SQL-strängar!</strong></p>\n<p>Det är frestande att skriva ovanstående fråga som:</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>Du kanske också tycker att du ska skriva din fråga så här (med citationstecken runt <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>Gör inte något av dessa misstag.</strong></p>\n<p>Som diskuterats i <a class=\"reference internal\" href=\"/sv/6.1/topics/security/#sql-injection-protection\"><span class=\"std std-ref\">Skydd mot SQL-injektion</span></a>, genom att använda <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> argumentet och lämna platshållarna ociterade skyddar du dig från <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/SQL_injection\">SQL injection attacks</a>, en vanlig exploatering där angripare injicerar godtycklig SQL i din databas. Om du använder stränginterpolering eller citerar platshållaren löper du risk för SQL-injektion.</p>\n</aside>\n</section>\n</section>\n<section id=\"executing-custom-sql-directly\">\n<span id=\"executing-custom-sql\"></span><h2>Exekvera anpassad SQL direkt<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>Ibland räcker inte ens <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>: du kan behöva utföra frågor som inte mappar rent till modeller, eller direkt köra <code class=\"docutils literal notranslate\"><span class=\"pre\">UPDATE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">INSERT</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">DELETE</span></code>-frågor.</p>\n<p>I dessa fall kan du alltid komma åt databasen direkt och helt undvika modellagret.</p>\n<p>Objektet <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection</span></code> representerar standardanslutningen till databasen. För att använda databasanslutningen, anropa <code class=\"docutils literal notranslate\"><span class=\"pre\">connection.cursor()</span></code> för att få ett cursor-objekt. Anropa sedan <code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.execute(sql,</span> <span class=\"pre\">[params])</span></code> för att köra SQL och <code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.fetchone()</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.fetchall()</span></code> för att returnera de resulterande raderna.</p>\n<p>Till exempel:</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>För att skydda mot SQL-injektion får du inte inkludera citattecken runt platshållarna <code class=\"docutils literal notranslate\"><span class=\"pre\">%s</span></code> i SQL-strängen.</p>\n<p>Observera att om du vill inkludera bokstavliga procenttecken i frågan måste du dubbla dem i det fall du skickar parametrar:</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>Om du använder <a class=\"reference internal\" href=\"/sv/6.1/topics/db/multi-db/\"><span class=\"doc\">fler än en databas</span></a> kan du använda <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connections</span></code> för att hämta anslutningen (och markören) för en specifik databas. <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connections</span></code> är ett ordboksliknande objekt som gör att du kan hämta en specifik anslutning med hjälp av dess alias:</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>Som standard kommer Python DB API att returnera resultat utan deras fältnamn, vilket innebär att du får en ”lista” med värden, snarare än ett ”dict”. Med en liten prestanda- och minneskostnad kan du returnera resultat som en <code class=\"docutils literal notranslate\"><span class=\"pre\">dict</span></code> genom att använda något liknande detta:</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>Ett annat alternativ är att använda <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> från Pythons standardbibliotek. En <code class=\"docutils literal notranslate\"><span class=\"pre\">namedtuple</span></code> är ett tuple-liknande objekt som har fält som är tillgängliga genom attributuppslagning; det är också indexerbart och itererbart. Resultaten är oföränderliga och tillgängliga med fältnamn eller index, vilket kan vara användbart:</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>Exemplen <code class=\"docutils literal notranslate\"><span class=\"pre\">dictfetchall()</span></code> och <code class=\"docutils literal notranslate\"><span class=\"pre\">namedtuplefetchall()</span></code> förutsätter unika kolumnnamn, eftersom en markör inte kan skilja på kolumner från olika tabeller.</p>\n<p>Här är ett exempel på skillnaden mellan de tre:</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>Anslutningar och markörer<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> och <code class=\"docutils literal notranslate\"><span class=\"pre\">cursor</span></code> implementerar mestadels standard Python DB-API som beskrivs i <span class=\"target\" id=\"index-2\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a> - förutom när det gäller <a class=\"reference internal\" href=\"/sv/6.1/topics/db/transactions/\"><span class=\"doc\">transaktionshantering</span></a>.</p>\n<p>Om du inte är bekant med Python DB-API, notera att SQL-satsen i <code class=\"docutils literal notranslate\"><span class=\"pre\">cursor.execute()</span></code> använder platshållare, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;%s&quot;</span></code>, snarare än att lägga till parametrar direkt i SQL. Om du använder den här tekniken kommer det underliggande databasbiblioteket automatiskt att escape dina parametrar vid behov.</p>\n<p>Observera också att Django förväntar sig platshållaren <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;%s&quot;</span></code>, <em>inte</em> platshållaren <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;?&quot;</span></code>, som används av SQLite Python-bindningar. Detta är för konsekvensens och sanitetens skull.</p>\n<p>Använda en markör som kontexthanterare:</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>är likvärdig med:</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>Anropa lagrade procedurer<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>Anropar en databaslagrad procedur med det angivna namnet. En sekvens (<code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>) eller ett lexikon (<code class=\"docutils literal notranslate\"><span class=\"pre\">kparams</span></code>) med inparametrar kan anges. De flesta databaser stöder inte <code class=\"docutils literal notranslate\"><span class=\"pre\">kparams</span></code>. Av Djangos inbyggda backends är det bara Oracle som stöder det.</p>\n<p>Till exempel, med den här lagrade proceduren i en Oracle-databas:</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>Detta kommer att kalla det:</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":"Utföra råa förfrågningar","anchor":"performing-raw-queries","children":[{"title":"Mappning av frågefält till modellfält","anchor":"mapping-query-fields-to-model-fields","children":[]},{"title":"Indexuppslagningar","anchor":"index-lookups","children":[]},{"title":"Uppskjutande av modellfält","anchor":"deferring-model-fields","children":[]},{"title":"Överföra parametrar till raw()","anchor":"passing-parameters-into-raw","children":[]}]},{"title":"Exekvera anpassad SQL direkt","anchor":"executing-custom-sql-directly","children":[{"title":"Anslutningar och markörer","anchor":"connections-and-cursors","children":[{"title":"Anropa lagrade procedurer","anchor":"calling-stored-procedures","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/6.1/topics/"},{"docname":"topics/db/index","title":"Modeller och databaser","url":"/sv/6.1/topics/db/"}],"prev":{"docname":"topics/db/managers","title":"Ansvariga","url":"/sv/6.1/topics/db/managers/"},"next":{"docname":"topics/db/transactions","title":"Databastransaktioner","url":"/sv/6.1/topics/db/transactions/"},"formats":{"html":"/sv/6.1/topics/db/sql/","markdown":"/sv/6.1/topics/db/sql.md","json":"/sv/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/sv/6.1/topics/db/sql/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}