{"title":"Basisdata","version":"3.1","locale":"id","docname":"ref/databases","url":"/id/3.1/ref/databases/","canonical":"https://djangodocs.dev/id/3.1/ref/databases/","summary":"Django officially supports the following databases: PostgreSQL, MariaDB, MySQL, Oracle, SQLite.","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>Hubungan tetap menghindari kelebihan dari pembangunan-kembali sebuah hubungan pada basisdata dalam setiap permintaan. mereka dikendalikan dengan parameter <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">CONN_MAX_AGE</code></a> yang menentukan umur waktu maksimal dari setiap hubungan. Itu dapat disetel secara berdiri sendiri untuk setiap basisdata.</p>\n<p>The default value is <code class=\"docutils literal notranslate\">0</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/3.1/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">CONN_MAX_AGE</code></a> to a positive integer of seconds. For\nunlimited persistent connections, set it to <code class=\"docutils literal notranslate\">None</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/3.1/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">CONN_MAX_AGE</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/3.1/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">CONN_MAX_AGE</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>Pada akhir dari setiap permintaan, Django menutup hubungan jika itu telah mencapai umur maksimalnya atau jika itu dalam keadaan kesalahan yang tidak dapat ditutup. Jika kesalahan basisdata apapun telah muncul selagi mengolah permintaan, Django memeriksa apakah hubungan masih bekerja, dan menutup itu jika itu tidak. Dengan demikian, kesalahan basisdata mempengaruhi kebanyakan satu permintaan; jika hubungan menjadi tidak berguna, permintaan selanjutnya mendapatkan hubungan segar.</p>\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/3.1/ref/settings/#std-setting-CONN_MAX_AGE\"><code class=\"xref std std-setting docutils literal notranslate\">CONN_MAX_AGE</code></a> menjadi nilai rendah atau bahkan <code class=\"docutils literal notranslate\">0</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</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 9.5 and higher. <a class=\"reference external\" href=\"https://www.psycopg.org/\">psycopg2</a> 2.5.4 or higher is\nrequired, though the latest release is recommended.</p>\n<section id=\"postgresql-connection-settings\">\n<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/3.1/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a> untuk rincian.</p>\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\">client_encoding</code>: <code class=\"docutils literal notranslate\">'UTF8'</code>,</p></li>\n<li><p><code class=\"docutils literal notranslate\">default_transaction_isolation</code>: <code class=\"docutils literal notranslate\">'read committed'</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\">timezone</code>:</dt><dd><ul>\n<li><p>when <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> is <code class=\"docutils literal notranslate\">True</code>, <code class=\"docutils literal notranslate\">'UTC'</code> by default, or the\n<a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-DATABASE-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</code></a> value set for the connection,</p></li>\n<li><p>when <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ</code></a> is <code class=\"docutils literal notranslate\">False</code>, the value of the global\n<a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-TIME_ZONE\"><code class=\"xref std std-setting docutils literal notranslate\">TIME_ZONE</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\">postgresql.conf</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\">READ COMMITTED</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\">REPEATABLE READ</code> atau <code class=\"docutils literal notranslate\">SERIALIZABLE</code>, setel itu dalam bagian <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\">OPTIONS</code></a> dari konfigurasi basisdata anda dalam <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</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\">import</span> <span class=\"nn\">psycopg2.extensions</span>\n\nDATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;isolation_level&#39;</span><span class=\"p\">:</span> psycopg2<span class=\"o\">.</span>extensions<span class=\"o\">.</span>ISOLATION_LEVEL_SERIALIZABLE<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</section>\n<section id=\"indexes-for-varchar-and-text-columns\">\n<h3>Indeks untuk kolom <code class=\"docutils literal notranslate\">varchar</code> dan <code class=\"docutils literal notranslate\">text</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\">db_index=True</code> pada bidang model anda, Django khususnya mengeluarkan pernyataan tunggal <code class=\"docutils literal notranslate\">CREATE INDEX</code>. Bagaimanapun, jika jenis basisdata untuk bidang adalah baik salah satu <code class=\"docutils literal notranslate\">varchar</code> atau <code class=\"docutils literal notranslate\">text</code> (misalnya, digunakan oleh <code class=\"docutils literal notranslate\">CharField</code>, <code class=\"docutils literal notranslate\">FileField</code>, dan <code class=\"docutils literal notranslate\">TextField</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\">LIKE</code> dalam SQL mereka, ketika selesai dengan jenis pencarian <code class=\"docutils literal notranslate\">contains</code> dan <code class=\"docutils literal notranslate\">startswith</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\">hstore</code>, <code class=\"docutils literal notranslate\">postgis</code>, dll.) menggunakan perpindahan, gunakan tindakan <a class=\"reference internal\" href=\"/id/3.1/ref/contrib/postgres/operations/#django.contrib.postgres.operations.CreateExtension\" title=\"django.contrib.postgres.operations.CreateExtension\"><code class=\"xref py py-class docutils literal notranslate\">CreateExtension</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>Ketika menggunakan <a class=\"reference internal\" href=\"/id/3.1/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\">QuerySet.iterator()</code></a>, Django membuka sebuah <a class=\"reference external\" href=\"https://www.psycopg.org/docs/usage.html#server-side-cursors\" title=\"(di Psycopg v2.9)\"><span class=\"xref std std-ref\">server-side cursor</span></a>. Secara awalan, PostgreSQL menganggap bahwa hanya 10% pertama dari hasil dari kursor permintaan akan diambil. Perencana penerimaan menghabiskan sedikit waktu merencanakan permintaan dan memulai mengembalikan hasil lebih cepat, tetapi ini dapat mengurangi penampilan jika lebih dari 10% dari hasil diambil. Anggapan PostgreSQL pada angka baris diambil untuk kursor permintaan dikendalikan dengan pilihan <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/runtime-config-query.html#GUC-CURSOR-TUPLE-FRACTION\">cursor_tuple_fraction</a>.</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://pgbouncer.github.io/\">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/3.1/ref/settings/#std-setting-DATABASE-AUTOCOMMIT\"><code class=\"xref std std-setting docutils literal notranslate\">AUTOCOMMIT</code></a> adalah <code class=\"docutils literal notranslate\">True</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/3.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</code></a> by setting <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-DATABASE-DISABLE_SERVER_SIDE_CURSORS\"><code class=\"xref std std-setting docutils literal notranslate\">DISABLE_SERVER_SIDE_CURSORS</code></a> menjadi <code class=\"docutils literal notranslate\">True</code>.</p>\n<p>Keuntungan dari kursor sisi-peladen dalam suasana penggabungan transaksi, anda dapat menyetel <a class=\"reference internal\" href=\"/id/3.1/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\">QuerySet</code> menggunakan kursor sisi-peladen dalam sebuah blok <a class=\"reference internal\" href=\"/id/3.1/topics/db/transactions/#django.db.transaction.atomic\" title=\"django.db.transaction.atomic\"><code class=\"xref py py-func docutils literal notranslate\">atomic()</code></a>, karena itu meniadakan <code class=\"docutils literal notranslate\">autocommit</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 menggunakan <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-SERIAL\">SERIAL data type</a> PostgreSQL untuk menyimpan peningkatan-otomatis primary key. Sebuah kolom <code class=\"docutils literal notranslate\">SERIAL</code> dihitung dengan nilai-nilai dari <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createsequence.html\">sequence</a> yang menjaga nilai ketersediaan selanjutnya. Secara manual memberikan nilai pada sebuah bidang peningkatan-otomatis tidak memperbaharui urutan bidang, yang mungkin kemudian menyebabkan sebuah pertentangan. Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.auth.models</span> <span class=\"kn\">import</span> User\n<span class=\"gp\">&gt;&gt;&gt; </span>User<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>username<span class=\"o\">=</span><span class=\"s1\">&#39;alice&#39;</span><span class=\"p\">,</span> pk<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>User<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>username<span class=\"o\">=</span><span class=\"s1\">&#39;bob&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">...</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>Jika anda butuh menentukan nilai-nilai seperti itu, setel kembali urutan setelah itu menghindari menggunakan sebuah nilai yang sudah dalam tabel. Perintah pengelolaan <a class=\"reference internal\" href=\"/id/3.1/ref/django-admin/#django-admin-sqlsequencereset\"><code class=\"xref std std-djadmin docutils literal notranslate\">sqlsequencereset</code></a> membangkitkan pernyataan SQL untuk melakukan itu.</p>\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/3.1/ref/settings/#std-setting-TEST_TEMPLATE\"><code class=\"xref std std-setting docutils literal notranslate\">TEST['TEMPLATE']</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\">'template0'</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=\"id3\"></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<aside class=\"version-note version-added\" data-version=\"3.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 3.0</p></aside>\n<p>Django supports MariaDB 10.2 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=\"id4\"></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 mendukung MySQL 5.6 dan lebih tinggi.</p>\n<p>Fitur <code class=\"docutils literal notranslate\">inspectdb</code> Django menggunakan basisdata <code class=\"docutils literal notranslate\">information_schema</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\">AUTO_INCREMENT</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/3.1/ref/models/fields/#django.db.models.AutoField\" title=\"django.db.models.AutoField\"><code class=\"xref py py-class docutils literal notranslate\">AutoField</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=\"id6\"></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=\"reference external\" href=\"https://pypi.org/project/mysqlclient/\">mysqlclient</a> adalah pengemudi asli. Itu adalah <strong>pilihan dianjurkan</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=\"id7\">\n<h4>mysqlclient<a class=\"heading-anchor\" href=\"#id7\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Django requires <a class=\"reference external\" href=\"https://pypi.org/project/mysqlclient/\">mysqlclient</a> 1.4.0 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/3.1/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>Anda dapat <a class=\"reference internal\" href=\"#creating-your-database\">membuat basisdata anda</a> menggunakan alat baris-perintah dan SQL 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>CREATE DATABASE <span class=\"o\">&lt;</span>dbname<span class=\"o\">&gt;</span> CHARACTER SET utf8<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>Pengaturan pemeriksaan untuk sebuah kolom mengendalikan urutan dimana data diurutkan sama halnya dengan string apa dibandingkan sebagai setara. Itu dapat disetel pada tingkat luas-basisdata dan juga per-tabel dan per-kolom. Itu adalah <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/charset.html\">documented thoroughly</a> dalam dokumentasi MySQL. Dalam semua kasus, anda menyetel pemeriksaan dengan langsung merubah tabel-tabel basisdata; Django tidak menyediakan cara mensetel ini pada sebuah pengertian model.</p>\n<p>Secara awalan, dengan basisdata UTF-8, MySQL akan menggunakan pemeriksaan <code class=\"docutils literal notranslate\">utf8_general_ci</code>. Ini menghasilkan dalam semua kesetaraan pembandingan string sedang diselesaikan dalam cara <em>kasus-tidak-peka</em>. Yaitu, <code class=\"docutils literal notranslate\">&quot;Fred&quot;</code> dan <code class=\"docutils literal notranslate\">&quot;freD&quot;</code> dianggap tidak sah untuk mencoba memasukkan kedua <code class=\"docutils literal notranslate\">&quot;aa&quot;</code> and <code class=\"docutils literal notranslate\">&quot;AA&quot;</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\">utf8_bin</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\">utf8_general_ci</code> adalah lebih cepat, tetapi sedikit kurang benar, daripada perbandingan untuk <code class=\"docutils literal notranslate\">utf8_unicode_ci</code>. Jika ini diterima untuk aplikasi anda, anda harus menggunakan <code class=\"docutils literal notranslate\">utf8_general_ci</code> karena itu lebih cepat. Jika ini tidak diterima (sebagai contoh, jika anda membutuhkan urutan kamus Jerman), gunakan <code class=\"docutils literal notranslate\">utf8_unicode_ci</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\">save()</code>, an\n<code class=\"docutils literal notranslate\">IntegrityError</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/3.1/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/3.1/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\">OPTIONS</code></a>.</p></li>\n<li><p><a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a>, <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-USER\"><code class=\"xref std std-setting docutils literal notranslate\">USER</code></a>, <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-PASSWORD\"><code class=\"xref std std-setting docutils literal notranslate\">PASSWORD</code></a>, <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a>,\n<a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\">PORT</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/3.1/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\">OPTIONS</code></a>, ini akan mengambil hak lebih tinggi terhadap <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</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>\nDATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.mysql&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s1\">&#39;read_default_file&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;/path/to/my.cnf&#39;</span><span class=\"p\">,</span>\n        <span class=\"p\">},</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n\n<span class=\"c1\"># my.cnf</span>\n<span class=\"p\">[</span>client<span class=\"p\">]</span>\ndatabase <span class=\"o\">=</span> NAME\nuser <span class=\"o\">=</span> USER\npassword <span class=\"o\">=</span> PASSWORD\ndefault<span class=\"o\">-</span>character<span class=\"o\">-</span><span class=\"nb\">set</span> <span class=\"o\">=</span> utf8\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\">ssl</code>, <code class=\"docutils literal notranslate\">init_command</code>, dan <code class=\"docutils literal notranslate\">sql_mode</code>.</p>\n<section id=\"setting-sql-mode\">\n<span id=\"mysql-sql-mode\"></span><h4>Mengatur <code class=\"docutils literal notranslate\">sql_mode</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>Dari MySQL 5.7 selanjutnya dan pada pemasangan segar dari MySQL 5.6, nilai awalan dari pilihan <code class=\"docutils literal notranslate\">sql_mode</code> mengandung <code class=\"docutils literal notranslate\">STRICT_TRANS_TABLES</code>. Pilihan itu meningkatkan peringatan menjadi kesalahan ketika data dipotong ketika pemasukan, jadi Django sangat menganjurkan mengaktifkan <a class=\"reference external\" href=\"https://dev.mysql.com/doc/refman/en/sql-mode.html#sql-mode-strict\">strict mode</a> untuk MySQL mencegah kehilangan data (antara <code class=\"docutils literal notranslate\">STRICT_TRANS_TABLES</code> atau <code class=\"docutils literal notranslate\">STRICT_ALL_TABLES</code>).</p>\n<p>Jika anda butuh menyesuaiakan suasana SQL, anda dapat mensetel variabel <code class=\"docutils literal notranslate\">sql_mode</code> seperti pilihan MySQL lain: antara dalam berkas konfigurasi atau dengan masukan <code class=\"docutils literal notranslate\">'init_command': &quot;SET sql_mode='STRICT_TRANS_TABLES'&quot;</code> dalam bagian <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\">OPTIONS</code></a> dari konfigurasi basisdata anda dalam <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</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\">'isolation_level'</code> dalam <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-OPTIONS\"><code class=\"xref std std-setting docutils literal notranslate\">OPTIONS</code></a> bagian dari konfigurasi basisdata anda dalam <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-DATABASES\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASES</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\">'read uncommitted'</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">'read committed'</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">'repeatable read'</code></p></li>\n<li><p><code class=\"docutils literal notranslate\">'serializable'</code></p></li>\n</ul>\n<p>or <code class=\"docutils literal notranslate\">None</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/3.1/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\">get_or_create()</code></a>\nwill raise an <a class=\"reference internal\" href=\"/id/3.1/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\">IntegrityError</code></a> but the object won't appear in\na subsequent <a class=\"reference internal\" href=\"/id/3.1/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\">get()</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>Setelah tabel dibuat, jalankan sebuah pernyataan <code class=\"docutils literal notranslate\">ALTER TABLE</code> untuk merubah sebuah tabel ke mesin penyimpanan baru (seperti InnoDB):</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>ALTER TABLE <span class=\"o\">&lt;</span>tablename<span class=\"o\">&gt;</span> ENGINE<span class=\"o\">=</span>INNODB<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\">init_command</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=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n   <span class=\"s1\">&#39;init_command&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;SET default_storage_engine=INNODB&#39;</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/3.1/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\">db_table</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/3.1/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/3.1/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\">VARCHAR</code> column types may have their\n<code class=\"docutils literal notranslate\">max_length</code> restricted to 255 characters if you are using <code class=\"docutils literal notranslate\">unique=True</code>\nfor the field. This affects <a class=\"reference internal\" href=\"/id/3.1/ref/models/fields/#django.db.models.CharField\" title=\"django.db.models.CharField\"><code class=\"xref py py-class docutils literal notranslate\">CharField</code></a>,\n<a class=\"reference internal\" href=\"/id/3.1/ref/models/fields/#django.db.models.SlugField\" title=\"django.db.models.SlugField\"><code class=\"xref py py-class docutils literal notranslate\">SlugField</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\">TextField</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\">BLOB</code> atau <code class=\"docutils literal notranslate\">TEXT</code>. Sejak <code class=\"docutils literal notranslate\">TextField</code> tidak memiliki panjang yang ditentukan, anda tidak dapat menanda itu sebagai <code class=\"docutils literal notranslate\">unique=True</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 5.6.4 dan kemudian dapat menyimpan store bagian detik, disediakan bahwa pengertian kolom termasuk petunjuk bagian (e.g. <code class=\"docutils literal notranslate\">DATETIME(6)</code>). Versi paling awal tidak mendukung mereka semua.</p>\n<p>Django tidak akan meningkatkan kolom yang ada untuk menyertakan bagian detik jika peladen basisdata mendukung itu. Jika anda ingin mengadakan mereka pada basisdata yang ada, itu terserah anda baik secara manual memperbaharui kolom pada basisdata sasaran, dengan menjalankan sebuah perintah seperti:</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>ALTER TABLE `your_table` MODIFY `your_datetime_column` DATETIME(6)\n</code></pre></div>\n<p>atau menggunakan tindakan <a class=\"reference internal\" href=\"/id/3.1/ref/migration-operations/#django.db.migrations.operations.RunSQL\" title=\"django.db.migrations.operations.RunSQL\"><code class=\"xref py py-class docutils literal notranslate\">RunSQL</code></a> dalam <a class=\"reference internal\" href=\"/id/3.1/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\">TIMESTAMP</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\">TIMESTAMP</code>, anda harus mensetel <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-USE_TZ\"><code class=\"xref std std-setting docutils literal notranslate\">USE_TZ = False</code></a> untuk menghindari kerusakan data. <a class=\"reference internal\" href=\"/id/3.1/ref/django-admin/#django-admin-inspectdb\"><code class=\"xref std std-djadmin docutils literal notranslate\">inspectdb</code></a> memetakan kolom-kolom ini pada <a class=\"reference internal\" href=\"/id/3.1/ref/models/fields/#django.db.models.DateTimeField\" title=\"django.db.models.DateTimeField\"><code class=\"xref py py-class docutils literal notranslate\">DateTimeField</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\">QuerySet.select_for_update()</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\">SELECT ... FOR UPDATE</code>\nstatement. If <code class=\"docutils literal notranslate\">select_for_update()</code> is used with an unsupported option, then\na <a class=\"reference internal\" href=\"/id/3.1/ref/exceptions/#django.db.NotSupportedError\" title=\"django.db.NotSupportedError\"><code class=\"xref py py-exc docutils literal notranslate\">NotSupportedError</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\">SKIP LOCKED</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\">NOWAIT</code></p></td>\n<td><p>X (≥10.3)</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\">OF</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\">select_for_update()</code> on MySQL, make sure you filter a queryset\nagainst at least set of fields contained in unique constraints or only against\nfields covered by indexes. Otherwise, an exclusive write lock will be acquired\nover 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\">'abc'</code>, <code class=\"docutils literal notranslate\">'def'</code> dan permintaan anda untuk <code class=\"docutils literal notranslate\">WHERE mycolumn=0</code>, kedua baris akan cocok. Mirip, <code class=\"docutils literal notranslate\">WHERE mycolumn=1</code> akan cocok nilai <code class=\"docutils literal notranslate\">'abc1'</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/3.1/ref/models/fields/#django.db.models.Field\" title=\"django.db.models.Field\"><code class=\"xref py py-class docutils literal notranslate\">Field</code></a> directly, adalah menimpa <a class=\"reference internal\" href=\"/id/3.1/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\">get_prep_value()</code></a>, atau menggunakan <a class=\"reference internal\" href=\"/id/3.1/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\">RawSQL</code></a>, <a class=\"reference internal\" href=\"/id/3.1/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\">extra()</code></a>, atau <a class=\"reference internal\" href=\"/id/3.1/topics/db/sql/#django.db.models.Manager.raw\" title=\"django.db.models.Manager.raw\"><code class=\"xref py py-meth docutils literal notranslate\">raw()</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 mendukung SQLite 3.8.3 dan terakhir.</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/3.1/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\">iexact</code></a> atau <a class=\"reference internal\" href=\"/id/3.1/ref/models/querysets/#std-fieldlookup-contains\"><code class=\"xref std std-lookup docutils literal notranslate\">contains</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\">filter(name__contains=&quot;aa&quot;)</code> will match a name of <code class=\"docutils literal notranslate\">&quot;Aabb&quot;</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/3.1/ref/models/querysets/#std-fieldlookup-iexact\"><code class=\"xref std std-lookup docutils literal notranslate\">iexact</code></a> filter will behave exactly\nthe same as the <a class=\"reference internal\" href=\"/id/3.1/ref/models/querysets/#std-fieldlookup-exact\"><code class=\"xref std std-lookup docutils literal notranslate\">exact</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\">REAL</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\">OperationalError: bassidata dikunci</code> menunjukkan bahwa aplikasi anda berpengalaman lebih bersamaan daripada <code class=\"docutils literal notranslate\">sqlite</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\">OperationalError: database is locked</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\">timeout</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=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"c1\"># ...</span>\n    <span class=\"s1\">&#39;timeout&#39;</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\">QuerySet.select_for_update()</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\">SELECT ... FOR UPDATE</code>. Memanggil itu tidak akan memiliki pengaruh.</p>\n</section>\n<section id=\"pyformat-parameter-style-in-raw-queries-not-supported\">\n<h3>Gaya parameter &quot;pyformat&quot; dalam permintaan mentah tidak didukung<a class=\"heading-anchor\" href=\"#pyformat-parameter-style-in-raw-queries-not-supported\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>For most backends, raw queries (<code class=\"docutils literal notranslate\">Manager.raw()</code> or <code class=\"docutils literal notranslate\">cursor.execute()</code>)\ncan use the &quot;pyformat&quot; parameter style, where placeholders in the query\nare given as <code class=\"docutils literal notranslate\">'%(name)s'</code> and the parameters are passed as a dictionary\nrather than a list. SQLite does not support this.</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\">QuerySet.iterator()</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://sqlite.org/isolation.html\">Isolation In SQLite</a> when\nmodifying a table while iterating over it using <a class=\"reference internal\" href=\"/id/3.1/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\">QuerySet.iterator()</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/3.1/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</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\">sqlite3</code></a> library. If the extension is\nnot enabled on your installation, a system error (<code class=\"docutils literal notranslate\">fields.E180</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</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 12.2 and higher. Version\n6.0 or 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\">python manage.py migrate</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\">RESOURCE</code> mempunyai hak istimewa yang diwajibkan <code class=\"docutils literal notranslate\">CREATE TABLE</code>, <code class=\"docutils literal notranslate\">CREATE SEQUENCE</code>, <code class=\"docutils literal notranslate\">CREATE PROCEDURE</code>, dan <code class=\"docutils literal notranslate\">CREATE TRIGGER`, dan seorang pengguna diberikan ``RESOURCE WITH ADMIN OPTION</code> dapat memberikan <code class=\"docutils literal notranslate\">RESOURCE</code>, pengguna seperti itu tidak dapat memberikan hak istimewa sendiri (yaitu <code class=\"docutils literal notranslate\">CREATE TABLE</code>), dan demikian <code class=\"docutils literal notranslate\">RESOURCE WITH ADMIN OPTION</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\">CREATE VIEW WITH ADMIN OPTION</code> and\n<code class=\"docutils literal notranslate\">CREATE MATERIALIZED VIEW WITH ADMIN OPTION</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\">SYS.DBMS_LOB</code> dan <code class=\"docutils literal notranslate\">SYS.DBMS_RANDOM</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=\"k\">EXECUTE</span> <span class=\"k\">ON</span> SYS<span class=\"p\">.</span>DBMS_LOB <span class=\"k\">TO</span> <span class=\"k\">user</span><span class=\"p\">;</span>\n<span class=\"k\">GRANT</span> <span class=\"k\">EXECUTE</span> <span class=\"k\">ON</span> SYS<span class=\"p\">.</span>DBMS_RANDOM <span class=\"k\">TO</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\">settings.py</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>DATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.oracle&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;xe&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;a_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;a_password&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;HOST&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PORT&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;&#39;</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/3.1/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a> dan <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\">PORT</code></a> kosong. Bagaimanapun, jika anda tidak menggunakan berkas <code class=\"docutils literal notranslate\">tnsnames.ora</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/3.1/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a> dan <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\">PORT</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>DATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.db.backends.oracle&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;xe&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;a_user&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PASSWORD&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;a_password&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;HOST&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;dbprod01ned.mycompany.com&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;PORT&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;1540&#39;</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/3.1/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a> and <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\">PORT</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/3.1/ref/settings/#std-setting-NAME\"><code class=\"xref std std-setting docutils literal notranslate\">NAME</code></a> jika kedua <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-HOST\"><code class=\"xref std std-setting docutils literal notranslate\">HOST</code></a> dan <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-PORT\"><code class=\"xref std std-setting docutils literal notranslate\">PORT</code></a> adalah kosong. Bentuk ini diwajibkan ketika menggunakan RAC atau basisdata tertanam tanpa <code class=\"docutils literal notranslate\">tnsnames.ora</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=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;localhost:1521/orclpdb1&#39;</span><span class=\"p\">,</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=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"p\">(</span>\n    <span class=\"s1\">&#39;(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))&#39;</span>\n    <span class=\"s1\">&#39;(CONNECT_DATA=(SERVICE_NAME=orclpdb1)))&#39;</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\">threaded</code> dari konfigurasi basisdata Oracle anda menjadi <code class=\"docutils literal notranslate\">True</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=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;threaded&#39;</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\">RETURNING INTO</code> untuk efesian mengambil nilai dari <code class=\"docutils literal notranslate\">AutoField</code> ketika memasukkan baris baru. Perilaku ini mungkin menghasilkan sebuah <code class=\"docutils literal notranslate\">DatabaseError</code> dallam pengaturan tidak biasa tertentu, seperti ketika memasukkan kedalam tabel jauh, atau kedalam sebuah tampilan dengan sebuah pemicu <code class=\"docutils literal notranslate\">INSTEAD OF</code>. Klausa <code class=\"docutils literal notranslate\">RETURNING INTO</code> dapat ditiadakan dengan mengatur pilihan <code class=\"docutils literal notranslate\">use_returning_into</code> dari konfigurasi basisdata menjadi <code class=\"docutils literal notranslate\">False</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=\"s1\">&#39;OPTIONS&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;use_returning_into&#39;</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\">SELECT</code> terpisah untuk mengambil nilai-nilai <code class=\"docutils literal notranslate\">AutoField</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\">db_table</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=\"nc\">LegacyModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        db_table <span class=\"o\">=</span> <span class=\"s1\">&#39;&quot;name_left_in_lowercase&quot;&#39;</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">ForeignModel</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        db_table <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\">migrate</code>, sebuah kesalahan <code class=\"docutils literal notranslate\">ORA-06552</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\">db_column</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\">date</code>, <code class=\"docutils literal notranslate\">timestamp</code>, <code class=\"docutils literal notranslate\">number</code> atau <code class=\"docutils literal notranslate\">float</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\">''</code>) daripada <code class=\"docutils literal notranslate\">NULL</code>, tetapi Oracle memperlakukan keduanya mirip. Untuk menyiasati ini, backend Oracle mengabaikan pilihan <code class=\"docutils literal notranslate\">null</code> tersirat pada bidang yang mempunyai string kosong sebagai nilai kemungkinan dan membangkitkan DDL seolah-olah <code class=\"docutils literal notranslate\">null=True</code>. Ketika mengambil dari basisdata, itu dianggap bahwa sebuah nilai <code class=\"docutils literal notranslate\">NULL</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\">TextField</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\">TextFields</code> sebagai kolom <code class=\"docutils literal notranslate\">NCLOB</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\">SELECT DISTINCT</code>. Ini berarti bahwa mencoba menggunakan metode <code class=\"docutils literal notranslate\">QuerySet.distinct</code> pada sebuah model yang menyertakan kolom <code class=\"docutils literal notranslate\">TextField</code> akan menghasilkan dalam sebuah kesalahan <code class=\"docutils literal notranslate\">ORA-00932</code> ketika berjalan terhadap Oracle. Sebagai pemecahannya, gunakan metode <code class=\"docutils literal notranslate\">QuerySet.defer</code> dalam berhubungan dengan <code class=\"docutils literal notranslate\">distinct()</code> untuk mencegah kolom <code class=\"docutils literal notranslate\">TextField</code> dari menjadi disertakan dalam daftar <code class=\"docutils literal notranslate\">SELECT DISTINCT</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\">base</code> module in it. For\nexample:</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>mysite<span class=\"o\">/</span>\n    <span class=\"o\">...</span>\n    mydbengine<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n        base<span class=\"o\">.</span>py\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\">base.py</code> module must contain a class named <code class=\"docutils literal notranslate\">DatabaseWrapper</code> that\nsubclasses an existing engine from the <code class=\"docutils literal notranslate\">django.db.backends</code> module. Here's an\nexample of subclassing the PostgreSQL engine to change a feature class\n<code class=\"docutils literal notranslate\">allows_group_by_selected_pks_on_model</code>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">mysite/mydbengine/base.py</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=\"nn\">django.db.backends.postgresql</span> <span class=\"kn\">import</span> base<span class=\"p\">,</span> features\n\n<span class=\"k\">class</span> <span class=\"nc\">DatabaseFeatures</span><span class=\"p\">(</span>features<span class=\"o\">.</span>DatabaseFeatures<span class=\"p\">):</span>\n    <span class=\"k\">def</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> model<span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"kc\">True</span>\n\n<span class=\"k\">class</span> <span class=\"nc\">DatabaseWrapper</span><span class=\"p\">(</span>base<span class=\"o\">.</span>DatabaseWrapper<span class=\"p\">):</span>\n    features_class <span class=\"o\">=</span> DatabaseFeatures\n</code></pre></figure>\n<p>Finally, you must specify a <a class=\"reference internal\" href=\"/id/3.1/ref/settings/#std-setting-DATABASE-ENGINE\"><code class=\"xref std std-setting docutils literal notranslate\">DATABASE-ENGINE</code></a> in your <code class=\"docutils literal notranslate\">settings.py</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>DATABASES <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n        <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;mydbengine&#39;</span><span class=\"p\">,</span>\n        <span class=\"o\">...</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/3.1.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=\"reference external\" href=\"https://pypi.org/project/django-cockroachdb/\">CockroachDB</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/django-firebird/\">Firebird</a></p></li>\n<li><p><a class=\"reference external\" href=\"https://pypi.org/project/django-mssql-backend/\">Microsoft SQL Server</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":"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":"id7","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":"Gaya parameter \"pyformat\" dalam permintaan mentah tidak didukung","anchor":"pyformat-parameter-style-in-raw-queries-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/3.1/ref/"}],"prev":{"docname":"ref/csrf","title":"Perlindungan Cross Site Request Forgery","url":"/id/3.1/ref/csrf/"},"next":{"docname":"ref/django-admin","title":"django-admin dan manage.py","url":"/id/3.1/ref/django-admin/"},"formats":{"html":"/id/3.1/ref/databases/","markdown":"/id/3.1/ref/databases.md","json":"/id/3.1/ref/databases.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/ref/databases.txt","official":"https://docs.djangoproject.com/id/3.1/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","pt-br","ko","es","el","pl"]}