Python dan SQLite adalah pasangan lama: aplikasi desktop, web, dan alat CLI memakai keduanya untuk menyimpan data tanpa server database terpisah. Kabar baiknya, modul sqlite3 sudah menjadi bagian standard library Python sejak versi 2.5, sehingga kita tidak perlu pip install apa pun untuk mulai bekerja. Chapter ini memperkenalkan modul tersebut, memeriksa versi SQLite yang dibawanya, lalu menulis program pertama kita — dari database di memori sampai berkas toko.db yang bisa dibuka kembali.
Section SQLite dengan Python adalah satu-satunya bagian Course SQLite yang menuntut pengetahuan Python dasar: variabel, fungsi, list, dan dictionary. Materi Course Python seperti section Fungsi dan Control Flow akan sangat membantu jika bagian tersebut belum pernah Anda pelajari.
sqlite3 Bawaan Python, Tanpa Instalasi #
SQLite adalah pustaka C berlisensi public domain, sehingga tim Python memutuskan menggabungkannya langsung ke dalam interpreter. Modul sqlite3 yang kita pakai adalah pembungkus tipis di atas pustaka tersebut, dan seluruh engine database berjalan di dalam proses Python sendiri — tidak ada server yang perlu dinyalakan. Modul ini juga mengikuti standar PEP 249 (Python Database API 2.0), gaya API yang sama dengan driver PostgreSQL dan MySQL, jadi kebiasaan yang terbentuk di sini bisa dipindahkan ke database lain.
Seluruh contoh pada section ini diuji pada Python 3.12.15. Versi engine SQLite yang dibawa modul tersebut kita periksa lewat atribut sqlite3.sqlite_version:
import sqlite3
print(sqlite3.sqlite_version)Output yang Dihasilkan:
3.53.1Atribut ini melaporkan versi pustaka C SQLite yang tertaut ke interpreter, bukan versi modul pembungkusnya. Versi modul sendiri pernah tersedia di atribut sqlite3.version, tetapi atribut tersebut kini sudah usang:
python3 -c "import sqlite3; print(sqlite3.version)"Output yang Dihasilkan:
<string>:1: DeprecationWarning: version is deprecated and will be removed in Python 3.14
2.6.0Program Pertama: Database di Memori #
Untuk latihan dan uji kode, kita bisa memakai database khusus ":memory:" — seluruh database dibuat di RAM dan lenyap saat koneksi ditutup. Tidak ada berkas yang tersisa, tidak ada data lama yang mengganggu. Program pertama kita membuat tabel, mengisi tiga baris, lalu membacanya kembali:
import sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("CREATE TABLE pelanggan (id INTEGER PRIMARY KEY, nama TEXT NOT NULL)")
cur.execute("INSERT INTO pelanggan (nama) VALUES (?)", ("Budi",))
cur.execute("INSERT INTO pelanggan (nama) VALUES (?)", ("Siti",))
cur.execute("INSERT INTO pelanggan (nama) VALUES (?)", ("Ani",))
hasil = cur.execute("SELECT id, nama FROM pelanggan ORDER BY id").fetchall()
for baris in hasil:
print(baris)
con.close()Output yang Dihasilkan:
(1, 'Budi')
(2, 'Siti')
(3, 'Ani')Mari kita bedah baris-baris pentingnya:
- Baris 3 (
con = sqlite3.connect(":memory:")): fungsiconnect()membuka koneksi ke database; argumen":memory:"meminta database baru di RAM. - Baris 4 (
cur = con.cursor()): objekCursordibuat dari koneksi; cursor adalah alat untuk mengeksekusi SQL dan mengambil hasil — perannya dibedah tuntas pada Chapter Koneksi dan Cursor. - Baris 6 (
cur.execute("CREATE TABLE ...")): cursor mengeksekusi DDL untuk membuat tabelpelanggandengan kolomidsebagai INTEGER PRIMARY KEY. - Baris 7-9 (
cur.execute("INSERT ... VALUES (?)", ...)): tiga baris disisipkan. Tanda tanya?adalah placeholder yang diisi nilai dari tuple parameter — mekanisme ini dibahas penuh pada Chapter Query Berparameter. - Baris 11 (
hasil = cur.execute(...).fetchall()): metodefetchall()mengambil seluruh hasil SELECT sebagai list of tuple. Setiap tuple berisi nilai kolom sesuai urutan di daftar SELECT. - Baris 15 (
con.close()): koneksi ditutup dan database di memori ikut lenyap.
Menyimpan Data ke Berkas #
Ganti ":memory:" dengan nama berkas, dan database menjadi permanen di disk. Ganti toko.db dengan path lain jika ingin menaruhnya di folder tertentu:
import sqlite3
con = sqlite3.connect("toko.db")
cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS pelanggan (id INTEGER PRIMARY KEY, nama TEXT NOT NULL)")
cur.execute("INSERT INTO pelanggan (nama) VALUES (?)", ("Budi",))
con.commit()
con.close()
print("baris tersimpan")Output yang Dihasilkan:
baris tersimpanSetelah program berhenti, berkas toko.db muncul di direktori kerja (ukurannya satu halaman, 8192 byte). Data di dalamnya bisa diverifikasi dari sqlite3 CLI yang sudah kita kenal pada section Menggunakan sqlite3 CLI:
sqlite3 toko.db "SELECT id, nama FROM pelanggan;"Output yang Dihasilkan:
1|BudiDari sini kita punya fondasi: koneksi, cursor, dan query berparameter. Chapter berikutnya membedah dua objek pertama tersebut lebih dalam, karena pembagian kerja Connection dan Cursor menentukan bagaimana kita mengelola transaction dan hasil query di seluruh aplikasi.