Basis data tidak selalu berwujud berkas. sqlite3 dapat menjalankan seluruh basis data di dalam memori prosesnya melalui nama khusus :memory:, sehingga tabel boleh dibuat, diisi, dan diperiksa tanpa satu byte pun ditulis ke penyimpanan. Topik ini membahas cara membukanya, sifat sementara datanya, dan perannya untuk eksperimen cepat serta pengujian.
Konsep basis data dalam memori#
Nama berkas :memory: diperlakukan istimewa oleh sqlite3. Alih-alih membuka berkas, program mengalokasikan basis data pada memori utama dan memperlakunya seperti basis data biasa, lengkap dengan tabel, indeks, dan transaksi. Perintah titik .databases membuktikan hal itu dengan mendaftar basis data yang sedang terbuka beserta berkas pendukungnya.
# .databases menampilkan basis data yang sedang terbuka
printf '.databases\n' | sqlite3 :memory:main: "" r/wEntri tunggal bernama main mewakili basis data yang sedang dipakai, sedangkan posisi berkasnya berupa teks kosong karena tidak ada berkas yang terlibat. Pada basis data berkas, posisi itu berisi jalan berkasnya. Perbedaan kecil ini menegaskan bahwa seluruh pekerjaan berlangsung di memori.
Basis data memori mendukung seluruh kemampuan SQLite yang lazim, dari CREATE TABLE sampai transaksi, karena yang berbeda hanyalah tempat simpanannya. Kecepatannya tinggi karena tulisan tidak pernah menyentuh perangkat penyimpanan, dan tidak ada penantian saling kunci antarproses yang perlu dikelola. Setiap pemanggilan sqlite3 :memory: juga memperoleh basis data miliknya sendiri, sekalipun dua sesi dijalankan berdampingan pada satu terminal. Karena sifat-sifat itulah :memory: cocok menjadi ruang uji, bukan tempat penyimpanan.
Eksperimen cepat tanpa berkas#
Kegunaan pertama :memory: adalah menguji ekspresi atau fungsi SQL tanpa persiapan apa pun. Satu perintah cukup untuk mencoba fungsi bawaan sebelum dipakai pada data sungguhan.
# perhitungan kecil tidak memerlukan berkas sama sekali
sqlite3 :memory: "SELECT 3*7, upper('perpustakaan');"21|PERPUSTAKAANPercobaan yang melibatkan tabel pun serupa. Blok SQL berikut dijalankan utuh pada satu basis data :memory:, mulai dari membuat tabel, mengisinya, sampai menghitung jatuh tempo pengembalian dengan fungsi date() yang menambah 14 hari pada tanggal pinjam. Bila blok itu disimpan sebagai berkas, perintah sqlite3 :memory: < nama-berkas mengeksekusinya sekaligus.
CREATE TABLE batas (
judul TEXT NOT NULL,
pinjam TEXT NOT NULL
);
INSERT INTO batas (judul, pinjam) VALUES
('Anak Sungai', '2026-02-14'),
('Musim di Ujung Jalan', '2026-03-01');
SELECT judul, date(pinjam, '+14 days') AS jatuh_tempo
FROM batas
ORDER BY jatuh_tempo;Anak Sungai|2026-02-28
Musim di Ujung Jalan|2026-03-15Perintah titik dan pernyataan SQL juga dapat bergantian dalam satu proses :memory: yang sama, seperti pada contoh yang menggambar hasilnya dalam mode box.
# perintah titik dan pernyataan SQL bergantian dalam satu proses :memory:
printf '.mode box\nCREATE TABLE uji (x INTEGER);\nINSERT INTO uji VALUES (7), (9);\nSELECT sum(x) FROM uji;\n' | sqlite3 :memory:╭────────╮
│ sum(x) │
╞════════╡
│ 16 │
╰────────╯Seluruh contoh di atas tidak menyisakan berkas apa pun setelah selesai. Basis data yang sama dapat dihancurkan dan dibuat ulang berkali-kali tanpa perlu perintah pembersihan. Kesalahan pada percobaan juga tidak berakibat apa pun, karena basis data yang salah cukup dibuang bersama prosesnya dan dibuat ulang seketika tanpa menyentuh data yang sungguhan. Pola ini sekaligus menghilangkan langkah membersihkan berkas uji setiap kali percobaan dimulai ulang dari awal.
Sifat sementara datanya#
Isi basis data :memory: hidup selama proses sqlite3 itu berjalan. Contoh berikut membuat tabel catatan dan mengisinya dalam satu pemanggilan.
# tabel dibuat dan diisi di dalam satu proses :memory:
sqlite3 :memory: "CREATE TABLE catatan (isi TEXT); INSERT INTO catatan VALUES ('contoh');"Pemanggilan berikutnya adalah proses yang terpisah, dengan basis data memori baru yang kosong. Upaya membaca tabel tadi berakhir error.
# proses sqlite3 yang baru tidak mengenal tabel tersebut
sqlite3 :memory: "SELECT * FROM catatan;"Parse error in 2nd command line argument: no such table: catatanPesan error itu bukan keanehan, melainkan konsekuensi langsung dari desain :memory:. Setiap proses memperoleh basis data kosong yang segar, dan seluruh isi proses sebelumnya lenyap tanpa jejak ketika prosesnya berakhir, baik karena sesi ditutup maupun karena program selesai. Tidak ada mekanisme pemulihan sebagaimana pada berkas basis data. Proses yang berhenti mendadak pun membiarkan :memory: lenyap, karena tidak ada jejak di penyimpanan yang tersisa untuk dipulihkan. Perilaku ini berlawanan dengan basis data berkas, yang barisnya tetap utuh setelah sesi ditutup dan bahkan dapat dibuka bersamaan oleh beberapa proses.
Peran dalam pengujian#
Sifat sementara itu justru menjadi keunggulan pada pengujian perangkat lunak. Pengujian membutuhkan keadaan awal yang selalu sama, berjalan cepat tanpa menyentuh penyimpanan, dan tidak menyisakan berkas di folder proyek. Basis data :memory: memenuhi ketiganya sekaligus, karena setiap proses pengujian memperoleh basis data kosong yang identik dan lenyap sendiri setelahnya. Dua pengujian yang berjalan bersamaan juga tidak mungkin saling mengganggu, sebab masing-masing memakai basis data yang terpisah di memori. Basis data memori juga meniadakan waktu tunggu tulisan ke penyimpanan, sehingga rangkaian pengujian dengan ribuan operasi tetap berjalan singkat. Apabila satu pengujian merusak datanya, pengujian berikutnya tetap memperoleh basis data yang bersih, sehingga kegagalan tidak menjalar ke kasus lain.
Pola yang sama dipakai aplikasi nyata. Modul sqlite3 bawaan Python, misalnya, menerima :memory: sebagai target koneksinya, sehingga fungsi uji dapat membangun skema dan datanya sendiri di memori.
import sqlite3
koneksi = sqlite3.connect(":memory:")
koneksi.execute("CREATE TABLE uji (x INTEGER)")
koneksi.execute("INSERT INTO uji VALUES (42)")
print(koneksi.execute("SELECT x FROM uji").fetchone()[0])42Fungsi connect mengembalikan objek koneksi yang dipakai mengeksekusi pernyataan, dan basis datanya lenyap ketika program berakhir. Uji berikutnya mulai lagi dari nol tanpa perlu kode pembersihan, sehingga rangkaian pengujian dapat dijalankan berulang kali dengan hasil yang selalu sama.
Ringkasan#
- :memory: menjalankan basis data sepenuhnya di memori proses, tanpa berkas apa pun di penyimpanan.
- Seluruh isi hilang ketika proses berakhir, dan pesan error no such table pada proses baru merupakan perilaku bawaannya.
- Sifat itu ideal untuk eksperimen cepat dan pengujian yang menuntut keadaan awal identik.
- Hasil yang layak disimpan diekspor dengan .dump atau .output sebelum prosesnya ditutup.
Referensi#
- Command Line Shell For SQLite — SQLite — Dokumentasi resmi sqlite3 yang menjelaskan nama khusus :memory: beserta sifat hilangnya data.
- SQL As Understood By SQLite — SQLite — Ikhtisar pernyataan SQL dan fungsi bawaan seperti date() yang dicoba pada basis data memori.