{"title":"Basisdata","version":"4.2","locale":"id","docname":"ref/databases","url":"/id/4.2/ref/databases/","canonical":"https://djangodocs.dev/id/4.2/ref/databases/","summary":"Django officially supports the following databases: PostgreSQL MariaDB MySQL Oracle SQLite There are also a number of database backends provided by third parties .…","html":"<h1>Basisdata<a class=\"heading-anchor\" href=\"#databases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django officially supports the following databases:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"#postgresql-notes\"><span class=\"std std-ref\">PostgreSQL</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#mariadb-notes\"><span class=\"std std-ref\">MariaDB</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#mysql-notes\"><span class=\"std std-ref\">MySQL</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#oracle-notes\"><span class=\"std std-ref\">Oracle</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"#sqlite-notes\"><span class=\"std std-ref\">SQLite</span></a></p></li>\n</ul>\n<p>There are also a number of <a class=\"reference internal\" href=\"#third-party-notes\"><span class=\"std std-ref\">database backends provided by third parties</span></a>.</p>\n<p>Django berusaha mendukung sebanyak mungkin fitur-fitur pada semua backend basisdata. bagaimanapun, tidak semua backend basisdata sama, dan kami harus membuat perancangan keputusan pada dimana fitur-fitur untuk mendukung dan dimana anggapan kami dapat membuat aman.</p>\n<p>This file describes some of the features that might be relevant to Django\nusage. It is not intended as a replacement for server-specific documentation or\nreference manuals.</p>\n<section id=\"general-notes\">\n<h2>Catatan umum<a class=\"heading-anchor\" href=\"#general-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"persistent-connections\">\n<span id=\"persistent-database-connections\"></span><h3>Hubungan tetap<a class=\"heading-anchor\" href=\"#persistent-connections\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Persistent connections avoid the overhead of reestablishing a connection to\nthe database in each HTTP request. They're controlled by the\n<a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> parameter which defines the maximum lifetime of a\nconnection. It can be set independently for each database.</p>\n<p>The default value is <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>, preserving the historical behavior of closing the\ndatabase connection at the end of each request. To enable persistent\nconnections, set <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> to a positive integer of seconds. For\nunlimited persistent connections, set it to <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>.</p>\n<section id=\"connection-management\">\n<h4>Pengelolaan hubungan<a class=\"heading-anchor\" href=\"#connection-management\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django membua sebuah hubungan pada basisdata ketika itu pertama kali membuat sebuah permintaan basisdata. Itu menjaga hubungan ini tetap terbuka dan menggunakan kembali itu dalam permintaan selanjutnya. Django menutup hubungan sekali itu melampau batas umur maksimal ditentukan oleh <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> atau ketika itu tidak digunakan lagi.</p>\n<p>Secara terperinci, Django otomatis membuha sebuah hubungan pada basisdata kapanpun dia membutuhkan satu dan tidak mempunyai satu -- baik karena ini adalah hubungan pertama, atau karena hubungan sebelumnya telah ditutup.</p>\n<p>Pada permulaan dari setiap permintaan, Django menutup hubungan jika itu telah mencapai umur maksimal. Jika basisdata anda memutuskan hubungan diam setelah beberapa waktu, anda harus menyetel <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> pada nilai terendah, sehingga Django tidak berusaha menggunakan hubungan yang telah diputus oleh peladen basisdata. (Masalah ini mungkin hanya berpengaruh situs lalu lintas sangat rendah.)</p>\n<p>At the end of each request, Django closes the connection if it has reached its\nmaximum age or if it is in an unrecoverable error state. If any database\nerrors have occurred while processing the requests, Django checks whether the\nconnection still works, and closes it if it doesn't. Thus, database errors\naffect at most one request per each application's worker thread; if the\nconnection becomes unusable, the next request gets a fresh connection.</p>\n<p>Setting <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-CONN_HEALTH_CHECKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_HEALTH_CHECKS</span></code></a> to <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code> can be used to improve the\nrobustness of connection reuse and prevent errors when a connection has been\nclosed by the database server which is now ready to accept and serve new\nconnections, e.g. after database server restart. The health check is performed\nonly once per request and only if the database is being accessed during the\nhandling of the request.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>The <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-CONN_HEALTH_CHECKS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_HEALTH_CHECKS</span></code></a> setting was added.</p>\n</aside>\n</section>\n<section id=\"caveats\">\n<h4>Peringatan<a class=\"heading-anchor\" href=\"#caveats\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Sejak setiap thread merawat hubungan dia sendiri, basisdata anda harus mendukung setidaknya sebanyak hubungan serentak ketika anda memiliki thread pekerja.</p>\n<p>Terkadang sebuah basisdata tidak mau diakses oleh kebanyakan dari tampilan anda, sebagai contoh karena itu adalah basisdata dari sebuah sistem luar, atau terima kasih ke penyimpanan sementara. Dalam kasus-kasus itu, anda harus mensetel <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">CONN_MAX_AGE</span></code></a> menjadi nilai rendah atau bahkan <code class=\"docutils literal notranslate\"><span class=\"pre\">0</span></code>, karena itu tidak masuk akal merawat sebuah hubungan untuk digunakan kembali. Ini akan membantu menjaga sejumlah hubungan serentak pada basisdata kecil ini.</p>\n<p>Peladen pengembangan membuat sebuah thread baru untuk setiap permintaan dia tangani, meniadakan pengaruh dari hubungan tetap. Jangan mengadakan mereka selama pengembangan.</p>\n<p>Ketika Django membangun sebuah hubungan ke basisdata, dia menyetel parameter yang sesuai, tergantung pada backend sedang digunakan. Jika anda mengadakan hubungan tetap, pengaturan ini tidak lagi berulang setiap permintaan. jika anda merubah parameter seperti tingkat pemisahan hubungan atau zona waktu, anda harus baik menyimpan kembali awalan Django pada akhir setiap permintaan, memaksa sebuah nilai sesuai pada permulaan dari setiap permintaan, atau meniadakan hubungan tetap.</p>\n<p>If a connection is created in a long-running process, outside of Django’s\nrequest-response cycle, the connection will remain open until explicitly\nclosed, or timeout occurs.</p>\n</section>\n</section>\n<section id=\"encoding\">\n<h3>Penyandian<a class=\"heading-anchor\" href=\"#encoding\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django menganggap bahwa semua basisdata menggunakan penyandian UTF-8. Menggunakan penyandian lain mungkn menghasilkan perilaku tidak diharapkan seperti kesalahan &quot;nilai terlalu panjang&quot; dari basisdata anda untuk data yang sah dalam Django. Lihat basisdata catatan khusus dibawah untuk informasi pada bagaimana menyetel basisdata anda dengan benar.</p>\n</section>\n</section>\n<section id=\"postgresql-notes\">\n<span id=\"id1\"></span><h2>Catatan PostgreSQL<a class=\"heading-anchor\" href=\"#postgresql-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django supports PostgreSQL 12 and higher. <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/\">psycopg</a> 3.1.8+ or <a class=\"reference external\" href=\"https://www.psycopg.org/\">psycopg2</a>\n2.8.4+ is required, though the latest <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/\">psycopg</a> 3.1.8+ is recommended.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Support for <code class=\"docutils literal notranslate\"><span class=\"pre\">psycopg2</span></code> is likely to be deprecated and removed at some\npoint in the future.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.2\">\n<p class=\"version-note-title\">Changed in Django 4.2</p><p>Support for <code class=\"docutils literal notranslate\"><span class=\"pre\">psycopg</span></code> 3.1.8+ was added.</p>\n</aside>\n<section id=\"postgresql-connection-settings\">\n<span id=\"id2\"></span><h3>Pengaturan hubungan PostgreSQL<a class=\"heading-anchor\" href=\"#postgresql-connection-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Lihat <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> untuk rincian.</p>\n<p>To connect using a service name from the <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/libpq-pgservice.html\">connection service file</a> and a\npassword from the <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/libpq-pgpass.html\">password file</a>, you must specify them in the\n<a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> part of your database configuration in <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.postgresql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;service&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;my_service&quot;</span><span class=\"p\">,</span>\n            <span class=\"s2\">&quot;passfile&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;.my_pgpass&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">.pg_service.conf</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>[my_service]\nhost=localhost\nuser=USER\ndbname=NAME\nport=5432\n</code></pre></figure>\n<figure class=\"code-block code-block-captioned\" data-language=\"text\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">.my_pgpass</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>localhost:5432:NAME:USER:PASSWORD\n</code></pre></figure>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Using a service name for testing purposes is not supported. This\n<a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/33685\">may be implemented later</a>.</p>\n</aside>\n</section>\n<section id=\"optimizing-postgresql-s-configuration\">\n<h3>Mengoptimalkan konfigurasi PostgreSQL<a class=\"heading-anchor\" href=\"#optimizing-postgresql-s-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django butuh parameter berikut untuk hubungan basisdatanya:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">client_encoding</span></code>: <code class=\"docutils literal notranslate\"><span class=\"pre\">'UTF8'</span></code>,</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">default_transaction_isolation</span></code>: <code class=\"docutils literal notranslate\"><span class=\"pre\">'read</span> <span class=\"pre\">committed'</span></code> secara awalan, atau nilai disetel dalam pilihan hubungan (lihat dibawah),</p></li>\n<li><dl class=\"simple\">\n<dt><code class=\"docutils literal notranslate\"><span class=\"pre\">timezone</span></code>:</dt><dd><ul>\n<li><p>when <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> is <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'UTC'</span></code> by default, or the\n<a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASE-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> value set for the connection,</p></li>\n<li><p>when <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span></code></a> is <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>, the value of the global\n<a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TIME_ZONE</span></code></a> setting.</p></li>\n</ul>\n</dd>\n</dl>\n</li>\n</ul>\n<p>Jika parameter ini sudah memiliki nilai benar, Django tidak akan mensetel mereka untuk setiap hubugan baru, yang which memperbaiki sedikit penampilan. Anda dapat menkonfigurasi mereka langsung dalam <code class=\"file docutils literal notranslate\"><span class=\"pre\">postgresql.conf</span></code> atau lebih nyaman per pengguna basisdata <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-alterrole.html\">ALTER ROLE</a>.</p>\n<p>Django akan bekerja baik tanpa optimalisasi ini, tetapi setiap hubungan baru akan melakukan beberapa permintaan untuk mensetel parameter ini.</p>\n</section>\n<section id=\"isolation-level\">\n<span id=\"database-isolation-level\"></span><h3>Tingkat terpencil<a class=\"heading-anchor\" href=\"#isolation-level\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Seperti PostgreSQL itu sendiri, awalan Django pada <code class=\"docutils literal notranslate\"><span class=\"pre\">READ</span> <span class=\"pre\">COMMITTED</span></code> <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/transaction-iso.html\">isolation level</a>. Jika anda butuh tingkat terpencil tertinggi seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">REPEATABLE</span> <span class=\"pre\">READ</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">SERIALIZABLE</span></code>, setel itu dalam bagian <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> dari konfigurasi basisdata anda dalam <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.backends.postgresql.psycopg_any</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">IsolationLevel</span>\n\n<span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;isolation_level&quot;</span><span class=\"p\">:</span> <span class=\"n\">IsolationLevel</span><span class=\"o\">.</span><span class=\"n\">SERIALIZABLE</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>Dibawah tingkat terpencil tertinggi, aplikasi anda harus dipersiapkan menangani pengecualian dimunculkan pada kegagalan serialisasi. Pilihan ini dirancang untuk pengguna lanjut.</p>\n</aside>\n<aside class=\"version-note version-changed\" data-version=\"4.2\">\n<p class=\"version-note-title\">Changed in Django 4.2</p><p><code class=\"docutils literal notranslate\"><span class=\"pre\">IsolationLevel</span></code> was added.</p>\n</aside>\n</section>\n<section id=\"role\">\n<span id=\"database-role\"></span><h3>Peran<a class=\"heading-anchor\" href=\"#role\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.2\">\n<p class=\"version-note-title\">New in Django 4.2</p></aside>\n<p>If you need to use a different role for database connections than the role use\nto establish the connection, set it in the <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> part of your\ndatabase configuration in <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.postgresql&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;assume_role&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;my_application_role&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n<section id=\"server-side-parameters-binding\">\n<span id=\"database-server-side-parameters-binding\"></span><h3>Server-side parameters binding<a class=\"heading-anchor\" href=\"#server-side-parameters-binding\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"4.2\">\n<p class=\"version-note-title\">New in Django 4.2</p></aside>\n<p>With <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/\">psycopg</a> 3.1.8+, Django defaults to the <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/advanced/cursors.html#client-side-binding-cursors\" title=\"(dalam psycopg)\"><span class=\"xref std std-ref\">client-side binding\ncursors</span></a>. If you want to use the\n<a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/basic/from_pg2.html#server-side-binding\" title=\"(dalam psycopg)\"><span class=\"xref std std-ref\">server-side binding</span></a> set it in the\n<a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> part of your database configuration in\n<a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.postgresql&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;server_side_binding&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>This option is ignored with <code class=\"docutils literal notranslate\"><span class=\"pre\">psycopg2</span></code>.</p>\n</section>\n<section id=\"indexes-for-varchar-and-text-columns\">\n<h3>Indeks untuk kolom <code class=\"docutils literal notranslate\"><span class=\"pre\">varchar</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">text</span></code><a class=\"heading-anchor\" href=\"#indexes-for-varchar-and-text-columns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ketika menentukan <code class=\"docutils literal notranslate\"><span class=\"pre\">db_index=True</span></code> pada bidang model anda, Django khususnya mengeluarkan pernyataan tunggal <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">INDEX</span></code>. Bagaimanapun, jika jenis basisdata untuk bidang adalah baik salah satu <code class=\"docutils literal notranslate\"><span class=\"pre\">varchar</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">text</span></code> (misalnya, digunakan oleh <code class=\"docutils literal notranslate\"><span class=\"pre\">CharField</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">FileField</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code>), kemudian Django akan membuat sebuah indeks tambahan yang menggunakan <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/indexes-opclass.html\">PostgreSQL operator class</a> untuk kolom. Indeks tambahan diperlukan untuk dengan benar melakukan pencarian yang menggunakan penghubung <code class=\"docutils literal notranslate\"><span class=\"pre\">LIKE</span></code> dalam SQL mereka, ketika selesai dengan jenis pencarian <code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">startswith</span></code>.</p>\n</section>\n<section id=\"migration-operation-for-adding-extensions\">\n<h3>Tindakan perpindahan untuk menambahkan tambahan.<a class=\"heading-anchor\" href=\"#migration-operation-for-adding-extensions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda butuh menambahkan sebuah tambahan PostgreSQL (seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">hstore</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">postgis</span></code>, dll.) menggunakan perpindahan, gunakan tindakan <a class=\"reference internal\" href=\"/id/4.2/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CreateExtension\" title=\"django.contrib.postgres.operations.CreateExtension\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CreateExtension</span></code></a>.</p>\n</section>\n<section id=\"server-side-cursors\">\n<span id=\"postgresql-server-side-cursors\"></span><h3>Kursor sisi-peladen<a class=\"heading-anchor\" href=\"#server-side-cursors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When using <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#django.db.models.query.QuerySet.iterator\" title=\"django.db.models.query.QuerySet.iterator\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.iterator()</span></code></a>, Django opens a <a class=\"reference external\" href=\"https://www.psycopg.org/psycopg3/docs/advanced/cursors.html#server-side-cursors\" title=\"(dalam psycopg)\"><span class=\"xref std std-ref\">server-side\ncursor</span></a>. By default, PostgreSQL assumes that\nonly the first 10% of the results of cursor queries will be fetched. The query\nplanner spends less time planning the query and starts returning results\nfaster, but this could diminish performance if more than 10% of the results are\nretrieved. PostgreSQL's assumptions on the number of rows retrieved for a\ncursor query is controlled with the <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-CURSOR-TUPLE-FRACTION\">cursor_tuple_fraction</a> option.</p>\n<section id=\"transaction-pooling-and-server-side-cursors\">\n<span id=\"transaction-pooling-server-side-cursors\"></span><h4>Menggabungkan transaksi dan kursor sisi-peladen<a class=\"heading-anchor\" href=\"#transaction-pooling-and-server-side-cursors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Using a connection pooler in transaction pooling mode (e.g. <a class=\"reference external\" href=\"https://www.pgbouncer.org/\">PgBouncer</a>)\nrequires disabling server-side cursors for that connection.</p>\n<p>Kursos sisi-peladen adalah lokal terhadap sebuah hubungan dan tetap terbuka pada akhir dari sebuah transaksi ketika <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASE-AUTOCOMMIT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">AUTOCOMMIT</span></code></a> adalah <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>. Sebuah transaksi seanjutnya mungkin berusaha mengambil hasil lebih dari kursor sisi-peladen. Dalam suasana pengumpulan transaksi, tidak ada jaminan bahwa transaksi sebelumnya akan menggunakan hubungan sama. Jika sebuah hubungan berbeda digunakan, sebuah kesalahan dimunculkan ketika transaksi  mengacu kursor sisi-peladen, karena kursos sisi-peladen hanya tersedia dalam hubungan dimana mereka dibuat.</p>\n<p>Satu pemecahan adalah untuk meniadakan kursor sisi peladen untuk sebuah hubungan adalah <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a> by setting <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DISABLE_SERVER_SIDE_CURSORS</span></code></a> menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>.</p>\n<p>Keuntungan dari kursor sisi-peladen dalam suasana penggabungan transaksi, anda dapat menyetel <a class=\"reference internal\" href=\"/id/4.2/topics/db/multi-db/\"><span class=\"doc\">another connection to the database</span></a> untuk melakukan permintaan yang menggunakan kursor sisi-peladen. Hubungan ini butuh salah satu langsung ke basisdata atau ke hubungan pengumpulan dalam suasana sesi pengumpulan.</p>\n<p>Pilihan lain adalah membungkus setiap <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> menggunakan kursor sisi-peladen dalam sebuah blok <a class=\"reference internal\" href=\"/id/4.2/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">atomic()</span></code></a>, karena itu meniadakan <code class=\"docutils literal notranslate\"><span class=\"pre\">autocommit</span></code> untuk lamanya transaksi. Cara ini, kursor sisi-peladen akan hanya tinggal untuk selama transaksi.</p>\n</section>\n</section>\n<section id=\"manually-specifying-values-of-auto-incrementing-primary-keys\">\n<span id=\"manually-specified-autoincrement-pk\"></span><h3>Manual-menentukan nilai-nilai dari primary key peningkatan-otomatis<a class=\"heading-anchor\" href=\"#manually-specifying-values-of-auto-incrementing-primary-keys\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django uses PostgreSQL's identity columns to store auto-incrementing primary\nkeys. An identity column is populated with values from a <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createsequence.html\">sequence</a> that keeps\ntrack of the next available value. Manually assigning a value to an\nauto-incrementing field doesn't update the field's sequence, which might later\ncause a conflict. 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=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.auth.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">User</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;alice&quot;</span><span class=\"p\">,</span> <span class=\"n\">pk</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;User: alice&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># The sequence hasn&#39;t been updated; its next value is 1.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">User</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">username</span><span class=\"o\">=</span><span class=\"s2\">&quot;bob&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">IntegrityError: duplicate key value violates unique constraint</span>\n<span class=\"go\">&quot;auth_user_pkey&quot; DETAIL:  Key (id)=(1) already exists.</span>\n</code></pre></div>\n<p>If you need to specify such values, reset the sequence afterward to avoid\nreusing a value that's already in the table. The <a class=\"reference internal\" href=\"/id/4.2/ref/django-admin/#django-admin-sqlsequencereset\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">sqlsequencereset</span></code></a>\nmanagement command generates the SQL statements to do that.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>In older versions, PostgreSQL’s <code class=\"docutils literal notranslate\"><span class=\"pre\">SERIAL</span></code> data type was used instead of\nidentity columns.</p>\n</aside>\n</section>\n<section id=\"test-database-templates\">\n<h3>Cetakan percobaan basisdata<a class=\"heading-anchor\" href=\"#test-database-templates\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Anda dapat menggunakan pengaturan <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-TEST_TEMPLATE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">TEST['TEMPLATE']</span></code></a> untuk menentukan  <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createdatabase.html\">template</a> (misalnya <code class=\"docutils literal notranslate\"><span class=\"pre\">'template0'</span></code>) dari mana membuat basis data percobaan.</p>\n</section>\n<section id=\"speeding-up-test-execution-with-non-durable-settings\">\n<h3>Mempercepat penjalanan percobaan dengan pengaturan tidak-tahan-lama<a class=\"heading-anchor\" href=\"#speeding-up-test-execution-with-non-durable-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Anda dapat mempercepat waktu penjalanan percobaan dengan <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/non-durability.html\">configuring PostgreSQL to be non-durable</a>.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Ini sangat berbahaya: itu akan membuat basisdata anda lebih rentan terhadap kehilangan data atau korupsi dalam kasus dari peladen roboh atau kehilangan daya. Gunakan ini hanya pada mesin pengembangan dimana anda dapat dengan mudah menyimpan kembali seluruh isi dari semua basisdata dalam gugus.</p>\n</aside>\n</section>\n</section>\n<section id=\"mariadb-notes\">\n<span id=\"id4\"></span><h2>MariaDB notes<a class=\"heading-anchor\" href=\"#mariadb-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django supports MariaDB 10.4 and higher.</p>\n<p>To use MariaDB, use the MySQL backend, which is shared between the two. See the\n<a class=\"reference internal\" href=\"#mysql-notes\"><span class=\"std std-ref\">MySQL notes</span></a> for more details.</p>\n</section>\n<section id=\"mysql-notes\">\n<span id=\"id5\"></span><h2>Catatan MySQL<a class=\"heading-anchor\" href=\"#mysql-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"version-support\">\n<h3>Versi dukungan<a class=\"heading-anchor\" href=\"#version-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django supports MySQL 8 and higher.</p>\n<p>Fitur <code class=\"docutils literal notranslate\"><span class=\"pre\">inspectdb</span></code> Django menggunakan basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">information_schema</span></code>, yang mengandung rincian data pada semua skema basisdata.</p>\n<p>Django mengharapkan basisdata untuk mendukung Unicode (UTF-8 encoding) dan menugaskan ke itu tugas dari memaksa transaksi dan keutuhan referensial. itu adalah penting untuk waspada dari fakta bahwa dua terakhir sebenarnya tidak dipaksa oleh MySQL ketika menggunakan mesin penyimpanan, lihat bagian selanjutnya.</p>\n</section>\n<section id=\"storage-engines\">\n<span id=\"mysql-storage-engines\"></span><h3>Mesin penyimpanan<a class=\"heading-anchor\" href=\"#storage-engines\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL mempunyai beberapa <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/storage-engines.html\">storage engines</a>. Anda dapat merubah mesin penyimpanan awalan dalam konfigurasi peladen.</p>\n<p>Mesin penyimpanan awalan MySQL adalah <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/innodb-storage-engine.html\">InnoDB</a>. Mesin ini sepenuhnya transaksional dan mendukung acuan foreign key. Itu adalah pilihan dianjurkan. Bagaimanapun penghitung peningkatan otomatis InnoDB hilang pada pemulaian kembali MySQL karena itu tidak ingat nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">AUTO_INCREMENT</span></code>, daripada membuat kembali itu sebagai &quot;max(id)+1&quot;. Ini mungkin menghasilkan sebuah penggunaan kembali tidak sengaja dari nilai <a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">AutoField</span></code></a>.</p>\n<p>Kekurangan utama dari <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/myisam-storage-engine.html\">MyISAM</a> adalah bahwa itu tidak mendukung transaksi atau memaksa batasan foreign-key.</p>\n</section>\n<section id=\"mysql-db-api-drivers\">\n<span id=\"id7\"></span><h3>Driver API DB MySQL<a class=\"heading-anchor\" href=\"#mysql-db-api-drivers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL mempunyai sepasang driver yang menerapkan API Basisdata Python digambarkan dalam <span class=\"target\" id=\"index-2\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0249/\"><strong>PEP 249</strong></a>:</p>\n<ul class=\"simple\">\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/mysqlclient/\">mysqlclient</a> is a native driver. It's <strong>the recommended choice</strong>.</p></li>\n<li><p><a class=\"reference external\" href=\"https://dev.mysql.com/downloads/connector/python/\">MySQL Connector/Python</a> adalah murni pengemudi Python dari Oracle yang tidak mewajibkan pustaka klien MySQL atau modul Python apapun diluar dari pustaka standar.</p></li>\n</ul>\n<p>Pengemudi ini adalah untaian-aman dan menyediakan hubungan menyatukan.</p>\n<p>Sebagai tambahan pada pengemudi API DB, Django butuh sebuah penyadur mengakses pengemudi basisdata dari ORM nya. Django menyediakan sebuah penyadur untuk mysqlclient selagi Penghubung/Python MySQL termasuk <a class=\"reference external\" href=\"https://dev.mysql.com/doc/connector-python/en/connector-python-django-backend.html\">its own</a>.</p>\n<section id=\"mysqlclient\">\n<h4>mysqlclient<a class=\"heading-anchor\" href=\"#mysqlclient\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django requires <a class=\"reference internal\" href=\"#mysqlclient\">mysqlclient</a> 1.4.3 or later.</p>\n</section>\n<section id=\"id8\">\n<h4>Penghubung MySQL/Python<a class=\"heading-anchor\" href=\"#id8\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Penghubung/Python MySQL tersedia dari <a class=\"reference external\" href=\"https://dev.mysql.com/downloads/connector/python/\">download page</a>. Penyadur Django tersedia dalam versi 1.1.X dan terakhir. itu mungkin tidak mendukung kebanyakan terbitan terakhir dari Django.</p>\n</section>\n</section>\n<section id=\"time-zone-definitions\">\n<span id=\"mysql-time-zone-definitions\"></span><h3>Pengertian zona waktu<a class=\"heading-anchor\" href=\"#time-zone-definitions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda berencana menggunakan dukungan <a class=\"reference internal\" href=\"/id/4.2/topics/i18n/timezones/\"><span class=\"doc\">timezone Django</span></a>, gunakan <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/mysql-tzinfo-to-sql.html\">mysql_tzinfo_to_sql</a> untuk memuat tabel zona waktu kedalam basisdata MySQL. Ini harus dilakukan hanya sekali untuk peladen MySQL anda, bukan per basisdata.</p>\n</section>\n<section id=\"creating-your-database\">\n<h3>Membuat basisdata anda<a class=\"heading-anchor\" href=\"#creating-your-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>You can <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/create-database.html\">create your database</a> using the command-line tools and this SQL:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">DATABASE</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"n\">dbname</span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"nb\">CHARACTER</span><span class=\"w\"> </span><span class=\"k\">SET</span><span class=\"w\"> </span><span class=\"n\">utf8</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Ini memastikan semua tabel dan kolom akan menggunakan UTF-8 secara awal.</p>\n<section id=\"collation-settings\">\n<span id=\"mysql-collation\"></span><h4>Pengaturan pemeriksaan<a class=\"heading-anchor\" href=\"#collation-settings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The collation setting for a column controls the order in which data is sorted\nas well as what strings compare as equal. You can specify the <code class=\"docutils literal notranslate\"><span class=\"pre\">db_collation</span></code>\nparameter to set the collation name of the column for\n<a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.CharField.db_collation\" title=\"django.db.models.CharField.db_collation\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a> and\n<a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.TextField.db_collation\" title=\"django.db.models.TextField.db_collation\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">TextField</span></code></a>.</p>\n<p>The collation can also be set on a database-wide level and per-table. This is\n<a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/charset.html\">documented thoroughly</a> in the MySQL documentation. In such cases, you must\nset the collation by directly manipulating the database settings or tables.\nDjango doesn't provide an API to change them.</p>\n<p>Secara awalan, dengan basisdata UTF-8, MySQL akan menggunakan pemeriksaan <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8_general_ci</span></code>. Ini menghasilkan dalam semua kesetaraan pembandingan string sedang diselesaikan dalam cara <em>kasus-tidak-peka</em>. Yaitu, <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Fred&quot;</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;freD&quot;</span></code> dianggap tidak sah untuk mencoba memasukkan kedua <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;aa&quot;</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;AA&quot;</span></code> kedalam kolom sama, sejak mereka membandingkan sebagai kesetaraan (dan, karenanya, bukan-unik) dengan pemeriksaan awalan. Jika anda ingin perbandingan kasus-peka pada kolom atau tabel tertentu, rubah kolom atau tabel untuk menggunakan pemeriksaan <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8_bin</span></code>.</p>\n<p>Harap catat bahwa menurut <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/charset-unicode-sets.html\">MySQL Unicode Character Sets</a>, perbandingan untuk pemeriksaan <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8_general_ci</span></code> adalah lebih cepat, tetapi sedikit kurang benar, daripada perbandingan untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8_unicode_ci</span></code>. Jika ini diterima untuk aplikasi anda, anda harus menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8_general_ci</span></code> karena itu lebih cepat. Jika ini tidak diterima (sebagai contoh, jika anda membutuhkan urutan kamus Jerman), gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8_unicode_ci</span></code> karena itu lebih akurat.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Peringatan</p>\n<p>Model formsets validate unique fields in a case-sensitive manner. Thus when\nusing a case-insensitive collation, a formset with unique field values that\ndiffer only by case will pass validation, but upon calling <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>, an\n<code class=\"docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code> will be raised.</p>\n</aside>\n</section>\n</section>\n<section id=\"connecting-to-the-database\">\n<h3>Menyambung ke basisdata<a class=\"heading-anchor\" href=\"#connecting-to-the-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Mengacu ke <a class=\"reference internal\" href=\"/id/4.2/ref/settings/\"><span class=\"doc\">pengaturan dokumentasi</span></a>.</p>\n<p>Pengaturan hubungan digunakan dalam urutan ini:</p>\n<ol class=\"arabic simple\">\n<li><p><a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a>, <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USER</span></code></a>, <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PASSWORD</span></code></a>, <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a>,\n<a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a></p></li>\n<li><p>Berkas pilihan MySQL.</p></li>\n</ol>\n<p>Dengan kata lain, jika anda mensetel nama dari basisdata dalam <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a>, ini akan mengambil hak lebih tinggi terhadap <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a>, yang akan menimpa apapin dalam <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/option-files.html\">MySQL option file</a>.</p>\n<p>Ini adalah contoh konfigurasi yang menggunakan berkas pilihan MySQL:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># settings.py</span>\n<span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.mysql&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;read_default_file&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;/path/to/my.cnf&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<div class=\"code-block\" data-language=\"ini\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Ini code\"><code><span class=\"c1\"># my.cnf</span>\n<span class=\"k\">[client]</span>\n<span class=\"na\">database</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">NAME</span>\n<span class=\"na\">user</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">USER</span>\n<span class=\"na\">password</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">PASSWORD</span>\n<span class=\"na\">default-character-set</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s\">utf8</span>\n</code></pre></div>\n<p>Beberapa <a class=\"reference external\" href=\"https://mysqlclient.readthedocs.io/user_guide.html#functions-and-attributes\">MySQLdb connection options</a> lain mungkin berguna, seperti <code class=\"docutils literal notranslate\"><span class=\"pre\">ssl</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">init_command</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code>.</p>\n<section id=\"setting-sql-mode\">\n<span id=\"mysql-sql-mode\"></span><h4>Mengatur <code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code><a class=\"heading-anchor\" href=\"#setting-sql-mode\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The default value of the <code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code> option contains <code class=\"docutils literal notranslate\"><span class=\"pre\">STRICT_TRANS_TABLES</span></code>.\nThat option escalates warnings into errors when data are truncated upon\ninsertion, so Django highly recommends activating a <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-mode.html#sql-mode-strict\">strict mode</a> for MySQL to\nprevent data loss (either <code class=\"docutils literal notranslate\"><span class=\"pre\">STRICT_TRANS_TABLES</span></code> or <code class=\"docutils literal notranslate\"><span class=\"pre\">STRICT_ALL_TABLES</span></code>).</p>\n<p>Jika anda butuh menyesuaiakan suasana SQL, anda dapat mensetel variabel <code class=\"docutils literal notranslate\"><span class=\"pre\">sql_mode</span></code> seperti pilihan MySQL lain: antara dalam berkas konfigurasi atau dengan masukan <code class=\"docutils literal notranslate\"><span class=\"pre\">'init_command':</span> <span class=\"pre\">&quot;SET</span> <span class=\"pre\">sql_mode='STRICT_TRANS_TABLES'&quot;</span></code> dalam bagian <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> dari konfigurasi basisdata anda dalam <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>.</p>\n</section>\n<section id=\"mysql-isolation-level\">\n<span id=\"id9\"></span><h4>Tingkat terpencil<a class=\"heading-anchor\" href=\"#mysql-isolation-level\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Ketika menjalankan pemuatan yang bersamaan, transaksi basisdata dari sesi-sesi berbeda (katakan, urutan lain menangani permintaan berbeda) mungkin berinteraksi dengan satu sama lain. Interaksi ini mungkin dipengaruhi oleh setiap <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/innodb-transaction-isolation-levels.html\">transaction isolation level</a> sesi. Anda dapat mensetel tingkat terpencil hubungan dengan sebuah masukan <code class=\"docutils literal notranslate\"><span class=\"pre\">'isolation_level'</span></code> dalam <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">OPTIONS</span></code></a> bagian dari konfigurasi basisdata anda dalam <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASES</span></code></a>. Nilai sah untuk masukan ini adalah empat sandar tingkat terpencil:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'read</span> <span class=\"pre\">uncommitted'</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'read</span> <span class=\"pre\">committed'</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'repeatable</span> <span class=\"pre\">read'</span></code></p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">'serializable'</span></code></p></li>\n</ul>\n<p>or <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> to use the server's configured isolation level. However, Django\nworks best with and defaults to read committed rather than MySQL's default,\nrepeatable read. Data loss is possible with repeatable read. In particular,\nyou may see cases where <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create\" title=\"django.db.models.query.QuerySet.get_or_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_or_create()</span></code></a>\nwill raise an <a class=\"reference internal\" href=\"/id/4.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code></a> but the object won't appear in\na subsequent <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> call.</p>\n</section>\n</section>\n<section id=\"creating-your-tables\">\n<h3>Membuat tabel anda<a class=\"heading-anchor\" href=\"#creating-your-tables\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ketika Django membangkitkan skema, itu tidak menentukan sebuah mesin penyimpanan, jadi tabel-tabel akan dibuat dengan apapun mesin penyimpanan awalan paladen basisdata anda dikonfigurasikan. Pemecahan paling mudah adalah mensetel mesin penyimpanan awalan peladen basisdata anda pada mesin yang diinginkan.</p>\n<p>Jika anda sedang menggunakan layanan rumahan dan tidak dapat merubah mesin penyimpanan awalan peladen, anda memiliki sepasang pilihan.</p>\n<ul>\n<li><p>After the tables are created, execute an <code class=\"docutils literal notranslate\"><span class=\"pre\">ALTER</span> <span class=\"pre\">TABLE</span></code> statement to\nconvert a table to a new storage engine (such as InnoDB):</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">ALTER</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"n\">tablename</span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">ENGINE</span><span class=\"o\">=</span><span class=\"n\">INNODB</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>Ini dapat membosankan jika anda memiliki banyak tabel.</p>\n</li>\n<li><p>Pilihan lain adalah menggunakan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">init_command</span></code> untuk MySQLdb sebelum membuat tabel anda:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;init_command&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;SET default_storage_engine=INNODB&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Ini menyetel mesin penyimpanan awalan diatas hubungan ke basisdata. Setelah tabel-tabel anda telah dibuat, anda harus memindahkan pilihan ini ketika itu menambahkan sebuah permintaan yaitu hanya dibutuhkan selama pembautan tabel pada setiap hubungan basisdata.</p>\n</li>\n</ul>\n</section>\n<section id=\"table-names\">\n<h3>Nama tabel<a class=\"heading-anchor\" href=\"#table-names\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ada <a class=\"reference external\" href=\"https://bugs.mysql.com/bug.php?id=48875\">known issues</a> di bahkan versi terakhir dari MySQL yang dapat menyebabkan kasus dari nama tabel dirubah ketika pernyataan SQL tertentu dijalankan dibawah kondisi tertentu. Itu dianjurkan bahwa anda menggunakan nama tabel huruf kecil, jika memungkinkan, untuk menghindari masalah apapun yang mungkin muncul dari perilaku ini. Django menggunakan nama tabel huruf kecil ketika it membangkitkan-otomatis nama tabel dari mdoel, jadi ini adalah pertimbangan utama jika anda sedang menimpa nama tabel melalui parameter <a class=\"reference internal\" href=\"/id/4.2/ref/models/options/#django.db.models.Options.db_table\" title=\"django.db.models.Options.db_table\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">db_table</span></code></a>.</p>\n</section>\n<section id=\"savepoints\">\n<h3>Savepoint<a class=\"heading-anchor\" href=\"#savepoints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Kedua ORM Django dan MySQL (ketika menggunakan InnoDB <a class=\"reference internal\" href=\"#mysql-storage-engines\"><span class=\"std std-ref\">storage engine</span></a>) mendukung basisdata <a class=\"reference internal\" href=\"/id/4.2/topics/db/transactions/#topics-db-transactions-savepoints\"><span class=\"std std-ref\">savepoints</span></a>.</p>\n<p>If you use the MyISAM storage engine please be aware of the fact that you will\nreceive database-generated errors if you try to use the <a class=\"reference internal\" href=\"/id/4.2/topics/db/transactions/#topics-db-transactions-savepoints\"><span class=\"std std-ref\">savepoint-related\nmethods of the transactions API</span></a>. The reason\nfor this is that detecting the storage engine of a MySQL database/table is an\nexpensive operation so it was decided it isn't worth to dynamically convert\nthese methods in no-op's based in the results of such detection.</p>\n</section>\n<section id=\"notes-on-specific-fields\">\n<h3>Catatan pada tabel khusus<a class=\"heading-anchor\" href=\"#notes-on-specific-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<section id=\"character-fields\">\n<span id=\"mysql-character-fields\"></span><h4>Bidang karakter<a class=\"heading-anchor\" href=\"#character-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Any fields that are stored with <code class=\"docutils literal notranslate\"><span class=\"pre\">VARCHAR</span></code> column types may have their\n<code class=\"docutils literal notranslate\"><span class=\"pre\">max_length</span></code> restricted to 255 characters if you are using <code class=\"docutils literal notranslate\"><span class=\"pre\">unique=True</span></code>\nfor the field. This affects <a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CharField</span></code></a>,\n<a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SlugField</span></code></a>. See <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/create-index.html#create-index-column-prefixes\">the MySQL documentation</a> for more\ndetails.</p>\n</section>\n<section id=\"textfield-limitations\">\n<h4>Batasan <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code><a class=\"heading-anchor\" href=\"#textfield-limitations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>MySQL hanya dapat mengindeks karakter N pertama dari kolom <code class=\"docutils literal notranslate\"><span class=\"pre\">BLOB</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">TEXT</span></code>. Sejak <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> tidak memiliki panjang yang ditentukan, anda tidak dapat menanda itu sebagai <code class=\"docutils literal notranslate\"><span class=\"pre\">unique=True</span></code>. MySQLakan melaporkan: &quot;kolom BLOB/TEXT '&lt;db_column&gt;' digunakan dalam spesifikasi kunci tanpa panjang kunci&quot;.</p>\n</section>\n<section id=\"fractional-seconds-support-for-time-and-datetime-fields\">\n<span id=\"mysql-fractional-seconds\"></span><h4>Pecahan kedua mendukung untuk bidang Time dan DateTime<a class=\"heading-anchor\" href=\"#fractional-seconds-support-for-time-and-datetime-fields\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>MySQL can store fractional seconds, provided that the column definition\nincludes a fractional indication (e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">DATETIME(6)</span></code>).</p>\n<p>Django will not upgrade existing columns to include fractional seconds if the\ndatabase server supports it. If you want to enable them on an existing database,\nit's up to you to either manually update the column on the target database, by\nexecuting a command like:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">ALTER</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">your_table</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"k\">MODIFY</span><span class=\"w\"> </span><span class=\"o\">`</span><span class=\"n\">your_datetime_column</span><span class=\"o\">`</span><span class=\"w\"> </span><span class=\"n\">DATETIME</span><span class=\"p\">(</span><span class=\"mi\">6</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>atau menggunakan tindakan <a class=\"reference internal\" href=\"/id/4.2/ref/migration-operations/#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RunSQL</span></code></a> dalam <a class=\"reference internal\" href=\"/id/4.2/topics/migrations/#data-migrations\"><span class=\"std std-ref\">data migration</span></a>.</p>\n</section>\n<section id=\"timestamp-columns\">\n<h4>Kolom <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMESTAMP</span></code><a class=\"heading-anchor\" href=\"#timestamp-columns\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Jika anda menggunakan sebuah basisdata warisan yang mengandung kolom <code class=\"docutils literal notranslate\"><span class=\"pre\">TIMESTAMP</span></code>, anda harus mensetel <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">USE_TZ</span> <span class=\"pre\">=</span> <span class=\"pre\">False</span></code></a> untuk menghindari kerusakan data. <a class=\"reference internal\" href=\"/id/4.2/ref/django-admin/#django-admin-inspectdb\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">inspectdb</span></code></a> memetakan kolom-kolom ini pada <a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DateTimeField</span></code></a> dan jika anda mengadakan dukungan zona waktu, kedua MySQL dan Django akan berusaha merubah nilai-nilai dari  UTC ke waktu lokal.</p>\n</section>\n</section>\n<section id=\"row-locking-with-queryset-select-for-update\">\n<h3>Penguncian baris dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.select_for_update()</span></code><a class=\"heading-anchor\" href=\"#row-locking-with-queryset-select-for-update\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>MySQL and MariaDB do not support some options to the <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code>\nstatement. If <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> is used with an unsupported option, then\na <a class=\"reference internal\" href=\"/id/4.2/ref/exceptions/#django.db.NotSupportedError\" title=\"django.db.NotSupportedError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">NotSupportedError</span></code></a> is raised.</p>\n<div class=\"table-scroll\" role=\"region\" tabindex=\"0\" aria-label=\"Table\"><table class=\"docutils align-default\">\n<thead>\n<tr class=\"row-odd\"><th class=\"head\"><p>Option</p></th>\n<th class=\"head\"><p>MariaDB</p></th>\n<th class=\"head\"><p>MySQL</p></th>\n</tr>\n</thead>\n<tbody>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">SKIP</span> <span class=\"pre\">LOCKED</span></code></p></td>\n<td><p>X (≥10.6)</p></td>\n<td><p>X (≥8.0.1)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">NOWAIT</span></code></p></td>\n<td><p>X</p></td>\n<td><p>X (≥8.0.1)</p></td>\n</tr>\n<tr class=\"row-even\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">OF</span></code></p></td>\n<td></td>\n<td><p>X (≥8.0.1)</p></td>\n</tr>\n<tr class=\"row-odd\"><td><p><code class=\"docutils literal notranslate\"><span class=\"pre\">NO</span> <span class=\"pre\">KEY</span></code></p></td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n</div>\n<p>When using <code class=\"docutils literal notranslate\"><span class=\"pre\">select_for_update()</span></code> on MySQL, make sure you filter a queryset\nagainst at least a set of fields contained in unique constraints or only\nagainst fields covered by indexes. Otherwise, an exclusive write lock will be\nacquired over the full table for the duration of the transaction.</p>\n</section>\n<section id=\"automatic-typecasting-can-cause-unexpected-results\">\n<h3>Typecasting otomatis dapat menggunakan hasil tidak diharapkan<a class=\"heading-anchor\" href=\"#automatic-typecasting-can-cause-unexpected-results\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ketika melakukan sebuah permintaan pada jenis string, tetapi dengan sebuah nilai integer, MySQL akan memaksa jenis-jenis dari semua nilai dalam tabel pada sebuah integer sebelum melakukan perbandingan. Jika tabel-tabel anda mengandung nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">'abc'</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'def'</span></code> dan permintaan anda untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span> <span class=\"pre\">mycolumn=0</span></code>, kedua baris akan cocok. Mirip, <code class=\"docutils literal notranslate\"><span class=\"pre\">WHERE</span> <span class=\"pre\">mycolumn=1</span></code> akan cocok nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">'abc1'</span></code>. Karena itu, bidang-bidang jenis string disertakan dalam Django akan selalu melempar nilai ke sebuah string sebelum menggunakan itu dalam sebuah permintaan.</p>\n<p>Jika anda menerapkan bdiang model penyesuaian yang mewarisi dari <a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Field</span></code></a> directly, adalah menimpa <a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.Field.get_prep_value\" title=\"django.db.models.Field.get_prep_value\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get_prep_value()</span></code></a>, atau menggunakan <a class=\"reference internal\" href=\"/id/4.2/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code></a>, <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">extra()</span></code></a>, atau <a class=\"reference internal\" href=\"/id/4.2/topics/db/sql/#django.db.models.Manager.raw\" title=\"django.db.models.Manager.raw\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">raw()</span></code></a>, anda harus memastikan bahwa anda melakukan typecasting yang sesuai.</p>\n</section>\n</section>\n<section id=\"sqlite-notes\">\n<span id=\"id10\"></span><h2>Catatan SQLite<a class=\"heading-anchor\" href=\"#sqlite-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django supports SQLite 3.21.0 and later.</p>\n<p><a class=\"reference external\" href=\"https://www.sqlite.org/\">SQLite</a> menyediakan cara lain pengembangan yang bagus untuk aplikasi-aplikasi yang terutama hanya-baca atau membutuhkan jejak kaki pemasangan terkecil. Seperti semua peladen basisdata, meskipun, ada beberapa perbendaan yang khusus pada SQLite yang anda harus waspadai.</p>\n<section id=\"substring-matching-and-case-sensitivity\">\n<span id=\"sqlite-string-matching\"></span><h3>Substring matching and case sensitivity<a class=\"heading-anchor\" href=\"#substring-matching-and-case-sensitivity\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Untuk semua versi SQLite, ada beberapa perilaku sedikit kontra-intuitif ketika berusaha mencocokkan beberapa jenis string. Ini dibangkitkan ketika menggunakan penyaring <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">iexact</span></code></a> atau <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#std-fieldlookup-contains\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">contains</span></code></a> dalam Queryset. Perilaku ini memecah menjadi dua kasus:</p>\n<p>1. For substring matching, all matches are done case-insensitively. That is a\nfilter such as <code class=\"docutils literal notranslate\"><span class=\"pre\">filter(name__contains=&quot;aa&quot;)</span></code> will match a name of <code class=\"docutils literal notranslate\"><span class=\"pre\">&quot;Aabb&quot;</span></code>.</p>\n<p>2. For strings containing characters outside the ASCII range, all exact string\nmatches are performed case-sensitively, even when the case-insensitive options\nare passed into the query. So the <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">iexact</span></code></a> filter will behave exactly\nthe same as the <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">exact</span></code></a> filter in these cases.</p>\n<p>Some possible workarounds for this are <a class=\"reference external\" href=\"https://www.sqlite.org/faq.html#q18\">documented at sqlite.org</a>, but they\naren't utilized by the default SQLite backend in Django, as incorporating them\nwould be fairly difficult to do robustly. Thus, Django exposes the default\nSQLite behavior and you should be aware of this when doing case-insensitive or\nsubstring filtering.</p>\n</section>\n<section id=\"decimal-handling\">\n<span id=\"sqlite-decimal-handling\"></span><h3>Decimal handling<a class=\"heading-anchor\" href=\"#decimal-handling\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLite has no real decimal internal type. Decimal values are internally\nconverted to the <code class=\"docutils literal notranslate\"><span class=\"pre\">REAL</span></code> data type (8-byte IEEE floating point number), as\nexplained in the <a class=\"reference external\" href=\"https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes\">SQLite datatypes documentation</a>, so they don't support\ncorrectly-rounded decimal floating point arithmetic.</p>\n</section>\n<section id=\"database-is-locked-errors\">\n<h3>Kesalahan &quot;Basisdata terkunci&quot;<a class=\"heading-anchor\" href=\"#database-is-locked-errors\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLite berarti menjadi basisdata ringan, dan demikian tidak dapat mendukung bersamaan tingkat tinggi. Kesalahan <code class=\"docutils literal notranslate\"><span class=\"pre\">OperationalError:</span> <span class=\"pre\">bassidata</span> <span class=\"pre\">dikunci</span></code> menunjukkan bahwa aplikasi anda berpengalaman lebih bersamaan daripada <code class=\"docutils literal notranslate\"><span class=\"pre\">sqlite</span></code> dapat tangani dalam konfigurasi awalan. Kesalahan ini berarti bahwa satu antrian atau proses mempunyai sebuah kunci khusus pada hubungan basisdata dan waktu habis antrian lain menunggu untuk kunci dibebaskan.</p>\n<p>Pembungkus SQLite Python mempunyai nilai waktu habis awalan yang menentukan seberapa lama detik urutan diizinkan untuk menunggu penguncian sebelum itu berakhir dan memunculkan kesalahan <code class=\"docutils literal notranslate\"><span class=\"pre\">OperationalError:</span> <span class=\"pre\">database</span> <span class=\"pre\">is</span> <span class=\"pre\">locked</span></code>.</p>\n<p>Jika anda mendapatkan kesalahan ini, anda dapat menyelesaikannya dengan:</p>\n<ul>\n<li><p>Berganti ke backend basisdata lain. Pada titik tertentu SQLite menjadi terlalu &quot;ringan&quot; untuk aplikasi dunia-sebenarnya, dan urutan kesalahan bersamaan ini menunjukkan anda telah mencapat titik itu.</p></li>\n<li><p>Menulis kembali kode anda untuk mengurangi bersamaan dan memastikan transaksi basisdata adalah berumur-pendek.</p></li>\n<li><p>Meningkatkan nilai waktu habis awalan dengan mengatur pilihan basisdata <code class=\"docutils literal notranslate\"><span class=\"pre\">timeout</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s2\">&quot;timeout&quot;</span><span class=\"p\">:</span> <span class=\"mi\">20</span><span class=\"p\">,</span>\n    <span class=\"c1\"># ...</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>This will make SQLite wait a bit longer before throwing &quot;database is locked&quot;\nerrors; it won't really do anything to solve them.</p>\n</li>\n</ul>\n</section>\n<section id=\"queryset-select-for-update-not-supported\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.select_for_update()</span></code> tidak didukung<a class=\"heading-anchor\" href=\"#queryset-select-for-update-not-supported\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>SQLite tidak mendukung sintaksis <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">...</span> <span class=\"pre\">FOR</span> <span class=\"pre\">UPDATE</span></code>. Memanggil itu tidak akan memiliki pengaruh.</p>\n</section>\n<section id=\"isolation-when-using-queryset-iterator\">\n<span id=\"sqlite-isolation\"></span><h3>Pengucilan ketika menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.iterator()</span></code><a class=\"heading-anchor\" href=\"#isolation-when-using-queryset-iterator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>There are special considerations described in <a class=\"reference external\" href=\"https://www.sqlite.org/isolation.html\">Isolation In SQLite</a> when\nmodifying a table while iterating over it using <a class=\"reference internal\" href=\"/id/4.2/ref/models/querysets/#django.db.models.query.QuerySet.iterator\" title=\"django.db.models.query.QuerySet.iterator\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">QuerySet.iterator()</span></code></a>. If\na row is added, changed, or deleted within the loop, then that row may or may\nnot appear, or may appear twice, in subsequent results fetched from the\niterator. Your code must handle this.</p>\n</section>\n<section id=\"enabling-json1-extension-on-sqlite\">\n<span id=\"sqlite-json1\"></span><h3>Enabling JSON1 extension on SQLite<a class=\"heading-anchor\" href=\"#enabling-json1-extension-on-sqlite\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To use <a class=\"reference internal\" href=\"/id/4.2/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">JSONField</span></code></a> on SQLite, you need to enable the\n<a class=\"reference external\" href=\"https://www.sqlite.org/json1.html\">JSON1 extension</a> on Python's <a class=\"reference external\" href=\"https://docs.python.org/3/library/sqlite3.html#module-sqlite3\" title=\"(di Python v3.14)\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">sqlite3</span></code></a> library. If the extension is\nnot enabled on your installation, a system error (<code class=\"docutils literal notranslate\"><span class=\"pre\">fields.E180</span></code>) will be\nraised.</p>\n<p>To enable the JSON1 extension you can follow the instruction on\n<a class=\"reference external\" href=\"https://code.djangoproject.com/wiki/JSON1Extension\">the wiki page</a>.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Catatan</p>\n<p>The JSON1 extension is enabled by default on SQLite 3.38+.</p>\n</aside>\n</section>\n</section>\n<section id=\"oracle-notes\">\n<span id=\"id12\"></span><h2>Catatan Oracle<a class=\"heading-anchor\" href=\"#oracle-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django supports <a class=\"reference external\" href=\"https://www.oracle.com/\">Oracle Database Server</a> versions 19c and higher. Version 7.0\nor higher of the <a class=\"reference external\" href=\"https://oracle.github.io/python-cx_Oracle/\">cx_Oracle</a> Python driver is required.</p>\n<p>Untuk perintah <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">manage.py</span> <span class=\"pre\">migrate</span></code> bekerja, pengguna basisdata Oracle anda harus mempunyai hak istimewa untuk menjalankan perintah berikut:</p>\n<ul class=\"simple\">\n<li><p>CREATE TABLE</p></li>\n<li><p>CREATE SEQUENCE</p></li>\n<li><p>CREATE PROCEDURE</p></li>\n<li><p>CREATE TRIGGER</p></li>\n</ul>\n<p>Untuk menjalankan deretan percobaan proyek, pengguna biasanya butuh hak <em>tambahan</em> ini:</p>\n<ul class=\"simple\">\n<li><p>CREATE USER</p></li>\n<li><p>ALTER USER</p></li>\n<li><p>DROP USER</p></li>\n<li><p>CREATE TABLESPACE</p></li>\n<li><p>DROP TABLESPACE</p></li>\n<li><p>CREATE SESSION WITH ADMIN OPTION</p></li>\n<li><p>CREATE TABLE WITH ADMIN OPTION</p></li>\n<li><p>CREATE SEQUENCE WITH ADMIN OPTION</p></li>\n<li><p>CREATE PROCEDURE WITH ADMIN OPTION</p></li>\n<li><p>CREATE TRIGGER WITH ADMIN OPTION</p></li>\n</ul>\n<p>Selagi peran <code class=\"docutils literal notranslate\"><span class=\"pre\">RESOURCE</span></code> mempunyai hak istimewa yang diwajibkan <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">SEQUENCE</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">PROCEDURE</span></code>, dan <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TRIGGER`,</span> <span class=\"pre\">dan</span> <span class=\"pre\">seorang</span> <span class=\"pre\">pengguna</span> <span class=\"pre\">diberikan</span> <span class=\"pre\">``RESOURCE</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> dapat memberikan <code class=\"docutils literal notranslate\"><span class=\"pre\">RESOURCE</span></code>, pengguna seperti itu tidak dapat memberikan hak istimewa sendiri (yaitu <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">TABLE</span></code>), dan demikian <code class=\"docutils literal notranslate\"><span class=\"pre\">RESOURCE</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> tidak biasanya cukup untuk menjalankan percobaan.</p>\n<p>Some test suites also create views or materialized views; to run these, the\nuser also needs <code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">VIEW</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">CREATE</span> <span class=\"pre\">MATERIALIZED</span> <span class=\"pre\">VIEW</span> <span class=\"pre\">WITH</span> <span class=\"pre\">ADMIN</span> <span class=\"pre\">OPTION</span></code> privileges. In particular, this\nis needed for Django's own test suite.</p>\n<p>Semua hak iswimewa ini disertakan dalam peran DBA, yang sesuai untuk digunakan pada basisdata pengembang pribadi.</p>\n<p>Backend basisdata Oracle menggunakan paket <code class=\"docutils literal notranslate\"><span class=\"pre\">SYS.DBMS_LOB</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">SYS.DBMS_RANDOM</span></code>, jadi pengguna anda akan membutuhkan menjalankan perizinan padanya. Itu secara biasa dapat diakses ke semua pengguna secara awal, tetapi di kasus itu tidak, anda akan butuh memberikan perizinan seperti itu:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">GRANT</span><span class=\"w\"> </span><span class=\"k\">EXECUTE</span><span class=\"w\"> </span><span class=\"k\">ON</span><span class=\"w\"> </span><span class=\"n\">SYS</span><span class=\"p\">.</span><span class=\"n\">DBMS_LOB</span><span class=\"w\"> </span><span class=\"k\">TO</span><span class=\"w\"> </span><span class=\"k\">user</span><span class=\"p\">;</span>\n<span class=\"k\">GRANT</span><span class=\"w\"> </span><span class=\"k\">EXECUTE</span><span class=\"w\"> </span><span class=\"k\">ON</span><span class=\"w\"> </span><span class=\"n\">SYS</span><span class=\"p\">.</span><span class=\"n\">DBMS_RANDOM</span><span class=\"w\"> </span><span class=\"k\">TO</span><span class=\"w\"> </span><span class=\"k\">user</span><span class=\"p\">;</span>\n</code></pre></div>\n<section id=\"id13\">\n<h3>Menyambung ke basisdata<a class=\"heading-anchor\" href=\"#id13\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Untuk menghubungkan menggunakan nama layanan dari basisdata Oracle anda, berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code> anda harus 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=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.oracle&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;xe&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_password&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PORT&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Dalam kasus ini, anda harus meninggakan kedua <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> dan <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a> kosong. Bagaimanapun, jika anda tidak menggunakan berkas <code class=\"docutils literal notranslate\"><span class=\"pre\">tnsnames.ora</span></code> atau metode penamaan mirip dan ingin berhubungan menggunakan SID (&quot;xe&quot; dalam contoh ini), kemudian isi kedua <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> dan <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a> seperti itu:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.db.backends.oracle&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;xe&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;USER&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_user&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PASSWORD&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;a_password&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;HOST&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;dbprod01ned.mycompany.com&quot;</span><span class=\"p\">,</span>\n        <span class=\"s2\">&quot;PORT&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;1540&quot;</span><span class=\"p\">,</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Anda harus salah andara mendukung kedua <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> and <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a>, atau meninggalkan kedua sebagai string kosong. Django akan menggunakan deskriptor hubungan berbeda tergantung pada pilihan itu.</p>\n<section id=\"full-dsn-and-easy-connect\">\n<h4>DSN dan Easy Connect penuh<a class=\"heading-anchor\" href=\"#full-dsn-and-easy-connect\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Sebuah Full DSN atau string Easy Connect dapat digunakan dalam <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">NAME</span></code></a> jika kedua <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">HOST</span></code></a> dan <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">PORT</span></code></a> adalah kosong. Bentuk ini diwajibkan ketika menggunakan RAC atau basisdata tertanam tanpa <code class=\"docutils literal notranslate\"><span class=\"pre\">tnsnames.ora</span></code>, sebagai contoh.</p>\n<p>Contoh dari Easy Connect string:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;localhost:1521/orclpdb1&quot;</span>\n</code></pre></div>\n<p>Contoh dari string DSN penuh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;NAME&quot;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n    <span class=\"s2\">&quot;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))&quot;</span>\n    <span class=\"s2\">&quot;(CONNECT_DATA=(SERVICE_NAME=orclpdb1)))&quot;</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"threaded-option\">\n<h3>Pilihan urutan<a class=\"heading-anchor\" href=\"#threaded-option\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda berencana menjalankan Django dalam lingkungan banyak antrian (yaitu Apache menggunakan modul MPM awalan pada sistem operasi modern apapun), kemudian anda <strong>harus</strong> mensetel pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">threaded</span></code> dari konfigurasi basisdata Oracle anda menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;threaded&quot;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Kegagalam melakukan ini akan menyebabkan tabrakan dan perilaku ganjil lain.</p>\n</section>\n<section id=\"insert-returning-into\">\n<h3>INSERT ... RETURNING INTO<a class=\"heading-anchor\" href=\"#insert-returning-into\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Secara awalan, backend Oracle menggunakan klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">RETURNING</span> <span class=\"pre\">INTO</span></code> untuk efesian mengambil nilai dari <code class=\"docutils literal notranslate\"><span class=\"pre\">AutoField</span></code> ketika memasukkan baris baru. Perilaku ini mungkin menghasilkan sebuah <code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseError</span></code> dallam pengaturan tidak biasa tertentu, seperti ketika memasukkan kedalam tabel jauh, atau kedalam sebuah tampilan dengan sebuah pemicu <code class=\"docutils literal notranslate\"><span class=\"pre\">INSTEAD</span> <span class=\"pre\">OF</span></code>. Klausa <code class=\"docutils literal notranslate\"><span class=\"pre\">RETURNING</span> <span class=\"pre\">INTO</span></code> dapat ditiadakan dengan mengatur pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">use_returning_into</span></code> dari konfigurasi basisdata menjadi <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"s2\">&quot;OPTIONS&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;use_returning_into&quot;</span><span class=\"p\">:</span> <span class=\"kc\">False</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>Dalam kasus ini, backend Oracle akan menggunakan permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span></code> terpisah untuk mengambil nilai-nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">AutoField</span></code>.</p>\n</section>\n<section id=\"naming-issues\">\n<h3>Masalah penamaan<a class=\"heading-anchor\" href=\"#naming-issues\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Oracle memaksakan batasan panjang nama dari 30 karakter. Untuk mengakomodasi ini, backend memotong penciri basisdata agar cocok, mengganti empat karakter akhir dari nama terpotong dengan sebuah nilai campuran MD5 berulang. Sebagai tambahan, backend merubah penciri basisdata menjadi semua-huruf-besar.</p>\n<p>Untuk mencegah perubahan ini (ini biasanya hanya membutuhkan ketika berhubungan dengan basisdata warisan atau mengakses tabel-tabel yang milik pengguna lain), gunakan sebuah nama terkutip sebagai nilai untuk <code class=\"docutils literal notranslate\"><span class=\"pre\">db_table</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">LegacyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&quot;name_left_in_lowercase&quot;&#39;</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">ForeignModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">db_table</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;&quot;OTHER_USER&quot;.&quot;NAME_ONLY_SEEMS_OVER_30&quot;&#39;</span>\n</code></pre></div>\n<p>Nama terkutip dapat juga digunakan dengan backend basisdata didukung lain Django; kecuali untuk Oracle, bagaimanapun, kutipan tidak mempunyai pengaruh.</p>\n<p>Ketika menjalankan <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code>, sebuah kesalahan <code class=\"docutils literal notranslate\"><span class=\"pre\">ORA-06552</span></code> mungkin ditemui jika kata kunci Oracle tertentu digunakan sebagai nama dari sebuah bidang model atau nilai dari sebuah pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">db_column</span></code>. Django mengutip semua penciri digunakan dalam permintaan untuk mencegah kebanyakan masalah seperti itu, tetapi kesalahan ini dapat masih muncul ketika sebuah jenis data oracle digunakan sebagai sebuah nama kolom. Khususnya, hati-hati menghindari penggunaan nama-nama <code class=\"docutils literal notranslate\"><span class=\"pre\">date</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">timestamp</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">number</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">float</span></code> sebagai nama bidang.</p>\n</section>\n<section id=\"null-and-empty-strings\">\n<span id=\"oracle-null-empty-strings\"></span><h3>String NULL dan kosong<a class=\"heading-anchor\" href=\"#null-and-empty-strings\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django umumnya memilih menggunakan string kosong (<code class=\"docutils literal notranslate\"><span class=\"pre\">''</span></code>) daripada <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code>, tetapi Oracle memperlakukan keduanya mirip. Untuk menyiasati ini, backend Oracle mengabaikan pilihan <code class=\"docutils literal notranslate\"><span class=\"pre\">null</span></code> tersirat pada bidang yang mempunyai string kosong sebagai nilai kemungkinan dan membangkitkan DDL seolah-olah <code class=\"docutils literal notranslate\"><span class=\"pre\">null=True</span></code>. Ketika mengambil dari basisdata, itu dianggap bahwa sebuah nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">NULL</span></code> dalam satu dari bidang-bidang ini sangat berarti string kosong, dan data secara diam dirubah untuk mencerminkan anggapan ini.</p>\n</section>\n<section id=\"id14\">\n<h3>Batasan <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code><a class=\"heading-anchor\" href=\"#id14\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Backend Oracle menyimpan <code class=\"docutils literal notranslate\"><span class=\"pre\">TextFields</span></code> sebagai kolom <code class=\"docutils literal notranslate\"><span class=\"pre\">NCLOB</span></code>. Oracle memaksakan beberapa pembatasan pada penggunaan seperti kolom LOB secara umum:</p>\n<ul class=\"simple\">\n<li><p>Kolom LOB tidak boleh digunakan sebagai primary key.</p></li>\n<li><p>Kolom LOB tidak boleh digunakan sebagai indeks.</p></li>\n<li><p>Kolom LOB mugnkin tidak digunakan dalam daftar <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span></code>. Ini berarti bahwa mencoba menggunakan metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.distinct</span></code> pada sebuah model yang menyertakan kolom <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> akan menghasilkan dalam sebuah kesalahan <code class=\"docutils literal notranslate\"><span class=\"pre\">ORA-00932</span></code> ketika berjalan terhadap Oracle. Sebagai pemecahannya, gunakan metode <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.defer</span></code> dalam berhubungan dengan <code class=\"docutils literal notranslate\"><span class=\"pre\">distinct()</span></code> untuk mencegah kolom <code class=\"docutils literal notranslate\"><span class=\"pre\">TextField</span></code> dari menjadi disertakan dalam daftar <code class=\"docutils literal notranslate\"><span class=\"pre\">SELECT</span> <span class=\"pre\">DISTINCT</span></code>.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"subclassing-the-built-in-database-backends\">\n<span id=\"subclassing-database-backends\"></span><h2>Subclassing the built-in database backends<a class=\"heading-anchor\" href=\"#subclassing-the-built-in-database-backends\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Django comes with built-in database backends. You may subclass an existing\ndatabase backends to modify its behavior, features, or configuration.</p>\n<p>Consider, for example, that you need to change a single database feature.\nFirst, you have to create a new directory with a <code class=\"docutils literal notranslate\"><span class=\"pre\">base</span></code> module in it. For\nexample:</p>\n<div class=\"code-block\" data-language=\"text\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Text code\"><code>mysite/\n    ...\n    mydbengine/\n        __init__.py\n        base.py\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">base.py</span></code> module must contain a class named <code class=\"docutils literal notranslate\"><span class=\"pre\">DatabaseWrapper</span></code> that\nsubclasses an existing engine from the <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.backends</span></code> module. Here's an\nexample of subclassing the PostgreSQL engine to change a feature class\n<code class=\"docutils literal notranslate\"><span class=\"pre\">allows_group_by_selected_pks_on_model</span></code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/mydbengine/base.py</span></code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.backends.postgresql</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">base</span><span class=\"p\">,</span> <span class=\"n\">features</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DatabaseFeatures</span><span class=\"p\">(</span><span class=\"n\">features</span><span class=\"o\">.</span><span class=\"n\">DatabaseFeatures</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">allows_group_by_selected_pks_on_model</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">model</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">DatabaseWrapper</span><span class=\"p\">(</span><span class=\"n\">base</span><span class=\"o\">.</span><span class=\"n\">DatabaseWrapper</span><span class=\"p\">):</span>\n    <span class=\"n\">features_class</span> <span class=\"o\">=</span> <span class=\"n\">DatabaseFeatures</span>\n</code></pre></figure>\n<p>Finally, you must specify a <a class=\"reference internal\" href=\"/id/4.2/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">DATABASE-ENGINE</span></code></a> in your <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code>\nfile:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s2\">&quot;default&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s2\">&quot;ENGINE&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;mydbengine&quot;</span><span class=\"p\">,</span>\n        <span class=\"c1\"># ...</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>You can see the current list of database engines by looking in\n<a class=\"extlink-source reference external\" href=\"https://github.com/django/django/blob/stable/4.2.x/django/db/backends\">django/db/backends</a>.</p>\n</section>\n<section id=\"using-a-3rd-party-database-backend\">\n<span id=\"third-party-notes\"></span><h2>Menggunakan backend basisdata pihak ketiga<a class=\"heading-anchor\" href=\"#using-a-3rd-party-database-backend\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sebagai tambahan pada basisdata didukung resmi, ada backend disediakan oleh pihak ketiga yang mengizinkan anda menggunakan basisdata lain dengan Django:</p>\n<ul class=\"simple\">\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-cockroachdb/\">CockroachDB</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-firebird/\">Firebird</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-google-spanner/\">Google Cloud Spanner</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/mssql-django/\">Microsoft SQL Server</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-snowflake/\">Snowflake</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-tidb/\">TiDB</a></p></li>\n<li><p><a class=\"extlink-pypi reference external\" href=\"https://pypi.org/project/django-yugabytedb/\">YugabyteDB</a></p></li>\n</ul>\n<p>Versi Django dan fitur ORM didukung oleh backend tidak resmi sangat beragam. Permintaan mengenai kemampuan khusus dari backend tidak resmi ini, bersama dengan permintaan didukung apapun, harus diarahkan ke saluran pendukung disediakan oleh proyek pihak ke3.</p>\n</section>","rootId":"databases","toc":[{"title":"Catatan umum","anchor":"general-notes","children":[{"title":"Hubungan tetap","anchor":"persistent-connections","children":[{"title":"Pengelolaan hubungan","anchor":"connection-management","children":[]},{"title":"Peringatan","anchor":"caveats","children":[]}]},{"title":"Penyandian","anchor":"encoding","children":[]}]},{"title":"Catatan PostgreSQL","anchor":"postgresql-notes","children":[{"title":"Pengaturan hubungan PostgreSQL","anchor":"postgresql-connection-settings","children":[]},{"title":"Mengoptimalkan konfigurasi PostgreSQL","anchor":"optimizing-postgresql-s-configuration","children":[]},{"title":"Tingkat terpencil","anchor":"isolation-level","children":[]},{"title":"Peran","anchor":"role","children":[]},{"title":"Server-side parameters binding","anchor":"server-side-parameters-binding","children":[]},{"title":"Indeks untuk kolom varchar dan text","anchor":"indexes-for-varchar-and-text-columns","children":[]},{"title":"Tindakan perpindahan untuk menambahkan tambahan.","anchor":"migration-operation-for-adding-extensions","children":[]},{"title":"Kursor sisi-peladen","anchor":"server-side-cursors","children":[{"title":"Menggabungkan transaksi dan kursor sisi-peladen","anchor":"transaction-pooling-and-server-side-cursors","children":[]}]},{"title":"Manual-menentukan nilai-nilai dari primary key peningkatan-otomatis","anchor":"manually-specifying-values-of-auto-incrementing-primary-keys","children":[]},{"title":"Cetakan percobaan basisdata","anchor":"test-database-templates","children":[]},{"title":"Mempercepat penjalanan percobaan dengan pengaturan tidak-tahan-lama","anchor":"speeding-up-test-execution-with-non-durable-settings","children":[]}]},{"title":"MariaDB notes","anchor":"mariadb-notes","children":[]},{"title":"Catatan MySQL","anchor":"mysql-notes","children":[{"title":"Versi dukungan","anchor":"version-support","children":[]},{"title":"Mesin penyimpanan","anchor":"storage-engines","children":[]},{"title":"Driver API DB MySQL","anchor":"mysql-db-api-drivers","children":[{"title":"mysqlclient","anchor":"mysqlclient","children":[]},{"title":"Penghubung MySQL/Python","anchor":"id8","children":[]}]},{"title":"Pengertian zona waktu","anchor":"time-zone-definitions","children":[]},{"title":"Membuat basisdata anda","anchor":"creating-your-database","children":[{"title":"Pengaturan pemeriksaan","anchor":"collation-settings","children":[]}]},{"title":"Menyambung ke basisdata","anchor":"connecting-to-the-database","children":[{"title":"Mengatur sql_mode","anchor":"setting-sql-mode","children":[]},{"title":"Tingkat terpencil","anchor":"mysql-isolation-level","children":[]}]},{"title":"Membuat tabel anda","anchor":"creating-your-tables","children":[]},{"title":"Nama tabel","anchor":"table-names","children":[]},{"title":"Savepoint","anchor":"savepoints","children":[]},{"title":"Catatan pada tabel khusus","anchor":"notes-on-specific-fields","children":[{"title":"Bidang karakter","anchor":"character-fields","children":[]},{"title":"Batasan TextField","anchor":"textfield-limitations","children":[]},{"title":"Pecahan kedua mendukung untuk bidang Time dan DateTime","anchor":"fractional-seconds-support-for-time-and-datetime-fields","children":[]},{"title":"Kolom TIMESTAMP","anchor":"timestamp-columns","children":[]}]},{"title":"Penguncian baris dengan QuerySet.select_for_update()","anchor":"row-locking-with-queryset-select-for-update","children":[]},{"title":"Typecasting otomatis dapat menggunakan hasil tidak diharapkan","anchor":"automatic-typecasting-can-cause-unexpected-results","children":[]}]},{"title":"Catatan SQLite","anchor":"sqlite-notes","children":[{"title":"Substring matching and case sensitivity","anchor":"substring-matching-and-case-sensitivity","children":[]},{"title":"Decimal handling","anchor":"decimal-handling","children":[]},{"title":"Kesalahan \"Basisdata terkunci\"","anchor":"database-is-locked-errors","children":[]},{"title":"QuerySet.select_for_update() tidak didukung","anchor":"queryset-select-for-update-not-supported","children":[]},{"title":"Pengucilan ketika menggunakan QuerySet.iterator()","anchor":"isolation-when-using-queryset-iterator","children":[]},{"title":"Enabling JSON1 extension on SQLite","anchor":"enabling-json1-extension-on-sqlite","children":[]}]},{"title":"Catatan Oracle","anchor":"oracle-notes","children":[{"title":"Menyambung ke basisdata","anchor":"id13","children":[{"title":"DSN dan Easy Connect penuh","anchor":"full-dsn-and-easy-connect","children":[]}]},{"title":"Pilihan urutan","anchor":"threaded-option","children":[]},{"title":"INSERT ... RETURNING INTO","anchor":"insert-returning-into","children":[]},{"title":"Masalah penamaan","anchor":"naming-issues","children":[]},{"title":"String NULL dan kosong","anchor":"null-and-empty-strings","children":[]},{"title":"Batasan TextField","anchor":"id14","children":[]}]},{"title":"Subclassing the built-in database backends","anchor":"subclassing-the-built-in-database-backends","children":[]},{"title":"Menggunakan backend basisdata pihak ketiga","anchor":"using-a-3rd-party-database-backend","children":[]}],"breadcrumbs":[{"docname":"ref/index","title":"Acuan API","url":"/id/4.2/ref/"}],"prev":{"docname":"ref/csrf","title":"Perlindungan Cross Site Request Forgery","url":"/id/4.2/ref/csrf/"},"next":{"docname":"ref/django-admin","title":"django-admin dan manage.py","url":"/id/4.2/ref/django-admin/"},"formats":{"html":"/id/4.2/ref/databases/","markdown":"/id/4.2/ref/databases.md","json":"/id/4.2/ref/databases.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/ref/databases.txt","official":"https://docs.djangoproject.com/id/4.2/ref/databases/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}