Materi pada Section Database dan SQL telah memperkenalkan koneksi, cursor, parameterized query, dan transaction satu per satu. Pada proyek ini kita menyatukan seluruh materi tersebut menjadi satu aplikasi yang utuh: aplikasi inventaris toko berbasis terminal dengan penyimpanan permanen di database SQLite. Selesainya proyek ini ditandai bukan oleh “programnya jalan”, melainkan oleh lulusnya rangkaian test otomatis yang membuktikan data tetap konsisten.

Yang Akan Kita Bangun #

Aplikasi ini mengelola satu tabel utama bernama produk dengan lima kolom: id, nama, kategori, harga, dan stok. Dari tabel tersebut kita membangun fitur berikut:

  • Operasi CRUD lengkap: tambah, lihat, ubah harga, sesuaikan stok, dan hapus produk.
  • Riwayat penyesuaian stok yang tercatat otomatis di tabel riwayat.
  • Validasi masukan yang menolak nama kosong, harga negatif, dan stok negatif.
  • Transaksi atomik: penyesuaian stok yang gagal tidak boleh meninggalkan data setengah jadi.
  • Pencarian nama dengan LIKE yang aman terhadap karakter % dan _.
  • Laporan: stok menipis, nilai inventaris per kategori, dan daftar produk bernilai terbesar.

Semua interaksi berjalan lewat menu bernomor di terminal, dan seluruh data tersimpan pada satu berkas inventaris.db yang dibuat otomatis saat pertama kali dijalankan.

Prasyarat #

Sebelum mulai, pastikan Anda telah memahami materi berikut:

  • Database dan SQL: SQLite dengan Python, Koneksi dan Cursor, Parameterized Queries, CRUD dengan SQLite, dan Transactions.
  • Modules dan Packages: Membuat Module Sendiri dan Main Module dan __name__, karena proyek ini dipecah menjadi dua module.
  • Exception Handling: try dan except serta Merancang Error Handling, terutama untuk Bagian 4.
  • File Handling: Context Manager dan with, yang dipakai untuk mengelola commit dan rollback.
  • Testing dan Code Quality: Menulis Test dengan pytest, Fixtures, Parametrized Tests, dan Testing Exceptions untuk Bagian 6.

Tidak ada package pihak ketiga yang dibutuhkan; module sqlite3 sudah tersedia di pustaka standar Python. Seluruh kode pada proyek ini diuji dengan Python 3.12 dan SQLite 3.53.

Struktur Proyek #

Kita menulis kode secara bertahap, tetapi struktur akhirnya hanya berupa empat berkas dalam satu folder:

text
aplikasi-inventaris/
├── schema.sql         # struktur tabel, index, dan data awal
├── database.py        # lapisan akses data (SQL hidup di sini)
├── main.py            # antarmuka pengguna berbasis menu
└── test_database.py   # test otomatis (ditambahkan di Bagian 6)

Pemisahan database.py dan main.py adalah keputusan arsitektur yang disengaja: perubahan cara penyimpanan data tidak boleh memaksa kita menulis ulang tampilan, dan sebaliknya. Berkas inventaris.db tidak perlu dibuat manual; aplikasi yang menyiapkannya sendiri pada saat dijalankan.

Peta Bagian #

BagianFokus
Bagian 1: Desain DatabaseSkema tabel produk dan riwayat, constraint, index, data awal
Bagian 2: Koneksi dan InisialisasiModule database.py, function koneksi(), inisialisasi idempoten, kerangka menu
Bagian 3: Operasi CRUDINSERT, SELECT, UPDATE, DELETE dengan parameterized query
Bagian 4: Validasi dan TransaksiValidasi masukan, penanganan IntegrityError, transaksi sesuaikan_stok()
Bagian 5: Pencarian dan LaporanPencarian LIKE dengan escape, filter kategori, laporan agregat
Bagian 6: Testing dan FinalisasiRefactor lapisan data agar testable, test pytest dengan database :memory:

Setiap bagian menghasilkan program yang benar-benar dapat dijalankan, sehingga Anda boleh berhenti di titik mana pun dan tetap memiliki aplikasi yang bekerja. Mari kita mulai dari fondasinya: desain database.