{"title":"Peralatan basisdata","version":"2.1","locale":"id","docname":"topics/db/instrumentation","url":"/id/2.1/topics/db/instrumentation/","canonical":"https://djangodocs.dev/id/2.1/topics/db/instrumentation/","summary":"New in Django 2.0 Untuk membantu anda memahami dan mengendalikan permintaan dengan kode anda, Django menyediakan sebuah kaitan untuk memasang fungsi pembungkus…","html":"<h1>Peralatan basisdata<a class=\"heading-anchor\" href=\"#database-instrumentation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<aside class=\"version-note version-added\" data-version=\"2.0\">\n<p class=\"version-note-title\">New in Django 2.0</p></aside>\n<p>Untuk membantu anda memahami dan mengendalikan permintaan dengan kode anda, Django menyediakan sebuah kaitan untuk memasang fungsi pembungkus disekitar penjalanan dari permintaan basisdata. Sebagai contoh, pembungkus dapat menghitung permintaan, mengukur lama permintaan, mencatat permintaan, atau bahkan mencegah penjalanan permintaan (sebagai contoh memastikan bahwa tidak ada permintaan diterbitkan selagi membangun cetakan dengan data pra pengambilan).</p>\n<p>Pembungkus-pembungkus dimodelkan setelah <span class=\"xref std std-doc\">middleware 1</span> -- mereka adalah callable yang mengambil callable lain sebagai argumen mereka. Mereka memanggil bahwa callable untuk meminta (kemungkinan dibungkus) permintaan basisdata, dan mereka dapat melakukan apa mereka ingin disekitaran panggilan itu. Mereka adalah, bagaimanapun, dibuat dan dipasang oleh kode pengguna, dan jadi tidak butuh memisahkan factory seperti middleware lakukan.</p>\n<p>Memasang sebuah pembungkus selesai dalam sebuah pengelola konteks -- jadi pembungkus adalah sementara dan tertentu pada beberapa alur di kode anda.</p>\n<p>Seperti disebutkan diatas, sebuah contoh dari sebuah pembungkus adalah penghadang penjalanan permintaan. Itu dapat terlihat seperti ini:</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\">blocker</span><span class=\"p\">(</span><span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">):</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">Exception</span><span class=\"p\">(</span><span class=\"s1\">&#39;No database access allowed here.&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Dan itu akan digunakan dalam sebuah tampilan untuk menghadang permintaan dari cetakan seperti berikut:</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<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">my_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">context</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"o\">...</span><span class=\"p\">}</span>  <span class=\"c1\"># Code to generate context with all data.</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"o\">...</span>\n    <span class=\"k\">with</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">execute_wrapper</span><span class=\"p\">(</span><span class=\"n\">blocker</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"n\">template_name</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Parameter dikirim ke pembungkus adalah:</p>\n<ul class=\"simple\">\n<li><p><span class=\"xref std std-doc\">middleware 1</span> -- sebuah callable, yang harus diminta dengan sisa dari parameter untuk menjalankan permintaan.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code> -- sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">str</span></code>, permintaan SQL dikirim ke basisdata.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> -- sebuah list/tuple dari nilai-nilai parameter untuk perintah SQL, atau list/tuple dari list/tuple jika panggilan dibungkus adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">executemany()</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">many</span></code> -- sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">bool</span></code> menunjukkan akhirnya panggilan dipangil adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">execute()</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">executemany()</span></code> (dan apakah <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code> diharapkan menjadi berurut dari nilai-nilai, atau urutan dari urutan-urutan dari nilai-nilai).</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> -- sebuah dictionary dengan data lebih lanjut tentang konteks dari permohonan. Ini menyertakan hubungan dan kursor.</p></li>\n</ul>\n<p>Menggunakan parameter, versi sedikit lebih rumit dari penghadang dapat menyertakan nama hubungan dalam pesan kesalahan:</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\">blocker</span><span class=\"p\">(</span><span class=\"n\">execute</span><span class=\"p\">,</span> <span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"p\">,</span> <span class=\"n\">many</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n    <span class=\"n\">alias</span> <span class=\"o\">=</span> <span class=\"n\">context</span><span class=\"p\">[</span><span class=\"s1\">&#39;connection&#39;</span><span class=\"p\">]</span><span class=\"o\">.</span><span class=\"n\">alias</span>\n    <span class=\"k\">raise</span> <span class=\"ne\">Exception</span><span class=\"p\">(</span><span class=\"s2\">&quot;Access to database &#39;</span><span class=\"si\">{}</span><span class=\"s2\">&#39; blocked here&quot;</span><span class=\"o\">.</span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">alias</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Untuk contoh lebih lengkap, sebuah pencatat permintaan dapat terlihat seperti ini:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">time</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">QueryLogger</span><span class=\"p\">:</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">queries</span> <span class=\"o\">=</span> <span class=\"p\">[]</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__call__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">execute</span><span class=\"p\">,</span> <span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"p\">,</span> <span class=\"n\">many</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">):</span>\n        <span class=\"n\">current_query</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;sql&#39;</span><span class=\"p\">:</span> <span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"s1\">&#39;params&#39;</span><span class=\"p\">:</span> <span class=\"n\">params</span><span class=\"p\">,</span> <span class=\"s1\">&#39;many&#39;</span><span class=\"p\">:</span> <span class=\"n\">many</span><span class=\"p\">}</span>\n        <span class=\"n\">start</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span>\n        <span class=\"k\">try</span><span class=\"p\">:</span>\n            <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">execute</span><span class=\"p\">(</span><span class=\"n\">sql</span><span class=\"p\">,</span> <span class=\"n\">params</span><span class=\"p\">,</span> <span class=\"n\">many</span><span class=\"p\">,</span> <span class=\"n\">context</span><span class=\"p\">)</span>\n        <span class=\"k\">except</span> <span class=\"ne\">Exception</span> <span class=\"k\">as</span> <span class=\"n\">e</span><span class=\"p\">:</span>\n            <span class=\"n\">current_query</span><span class=\"p\">[</span><span class=\"s1\">&#39;status&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;error&#39;</span>\n            <span class=\"n\">current_query</span><span class=\"p\">[</span><span class=\"s1\">&#39;exception&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">e</span>\n            <span class=\"k\">raise</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"n\">current_query</span><span class=\"p\">[</span><span class=\"s1\">&#39;status&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;ok&#39;</span>\n            <span class=\"k\">return</span> <span class=\"n\">result</span>\n        <span class=\"k\">finally</span><span class=\"p\">:</span>\n            <span class=\"n\">duration</span> <span class=\"o\">=</span> <span class=\"n\">time</span><span class=\"o\">.</span><span class=\"n\">time</span><span class=\"p\">()</span> <span class=\"o\">-</span> <span class=\"n\">start</span>\n            <span class=\"n\">current_query</span><span class=\"p\">[</span><span class=\"s1\">&#39;duration&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">duration</span>\n            <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">queries</span><span class=\"o\">.</span><span class=\"n\">append</span><span class=\"p\">(</span><span class=\"n\">current_query</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Untuk menggunakan ini, anda dapat membuat sebuah obyek pencatat dan memasang itu sebagai pembungkus:</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=\"n\">ql</span> <span class=\"o\">=</span> <span class=\"n\">QueryLogger</span><span class=\"p\">()</span>\n<span class=\"k\">with</span> <span class=\"n\">connection</span><span class=\"o\">.</span><span class=\"n\">execute_wrapper</span><span class=\"p\">(</span><span class=\"n\">ql</span><span class=\"p\">):</span>\n    <span class=\"n\">do_queries</span><span class=\"p\">()</span>\n<span class=\"c1\"># Now we can print the log.</span>\n<span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">ql</span><span class=\"o\">.</span><span class=\"n\">queries</span><span class=\"p\">)</span>\n</code></pre></div>\n<section id=\"connection-execute-wrapper\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">connection.execute_wrapper()</span></code><a class=\"heading-anchor\" href=\"#connection-execute-wrapper\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.backends.base.DatabaseWrapper.execute_wrapper\">\n<span class=\"sig-name descname\"><span class=\"pre\">execute_wrapper</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">wrapper</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.backends.base.DatabaseWrapper.execute_wrapper\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Mengembalikan pengeola konteks yang, ketika dimasukkan, memasang sebuah pembungkus disekitar penjalanan permintaan basisdata, dan ketika keluar, memindahkan pembungkus. Pembungkus dipasang pada obyek hubungan lokal-thread.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">wrapper</span></code> adalah sebuah callable mengambil lima argumen. Itu dipanggil untuk setiap penjalanan permintaan dalam cakupan dari pengelola konteks, dengan argumen <code class=\"docutils literal notranslate\"><span class=\"pre\">execute</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">sql</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">params</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">many</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">context</span></code> sebagai digambarkan diatas. Itu diharapkan memanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">execute(sql,</span> <span class=\"pre\">params,</span> <span class=\"pre\">many,</span> <span class=\"pre\">context)</span></code> dan mengembalikan nilai balikan dari panggilan itu.</p>\n</section>","rootId":"database-instrumentation","toc":[{"title":"connection.execute_wrapper()","anchor":"connection-execute-wrapper","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/2.1/topics/"},{"docname":"topics/db/index","title":"Model dan basisdata","url":"/id/2.1/topics/db/"}],"prev":{"docname":"topics/db/optimization","title":"Optimisasi akses basisdata","url":"/id/2.1/topics/db/optimization/"},"next":{"docname":"topics/db/examples/index","title":"Contoh-contoh dari hubungan model penggunaan API","url":"/id/2.1/topics/db/examples/"},"formats":{"html":"/id/2.1/topics/db/instrumentation/","markdown":"/id/2.1/topics/db/instrumentation.md","json":"/id/2.1/topics/db/instrumentation.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/topics/db/instrumentation.txt","official":"https://docs.djangoproject.com/id/2.1/topics/db/instrumentation/","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"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}