Setiap pipeline data engineering berakhir di sebuah tempat penyimpanan, baik itu basis data relasional, warehouse, maupun berkas kolom seperti Parquet. Sebelum melangkah ke materi SQL dan pipeline, kita perlu menyiapkan database yang akan dipakai sepanjang course ini. Tiga pilihan yang saling melengkapi: SQLite untuk latihan tanpa instalasi, DuckDB untuk analitik berukuran besar di laptop, dan PostgreSQL untuk skenario produksi yang sesungguhnya. Ketiganya dipakai bergantian di section berikutnya, jadi pastikan ketiganya siap di lingkungan Anda.

Tiga Pilihan yang Saling Melengkapi #

AspekSQLiteDuckDBPostgreSQL
Cara instalasimenyertai Pythonpip install duckdbapt, installer, atau Docker
Jenis bebantransaksi kecilanalitik (OLAP)transaksi dan banyak koneksi
Penyimpanansatu berkassatu berkasserver tersendiri
Cocok untuklatihan, data kecileksplorasi, miliaran barisaplikasi dan pipeline produksi

SQLite dan DuckDB bersifat embedded: keduanya berjalan di dalam proses Python kita sendiri tanpa server terpisah. PostgreSQL bekerja sebaliknya — klien terhubung ke server yang berjalan terus-menerus, model yang sama dengan warehouse di perusahaan.

SQLite: Nol Instalasi #

Modul sqlite3 menyertai Python sejak awal, sehingga verifikasi cukup satu baris:

bash
python3 -c "import sqlite3; print(sqlite3.sqlite_version)"

Output yang Dihasilkan:

text
3.53.1

Angka tersebut adalah versi mesin SQLite yang ditanamkan di dalam interpreter Python Anda, bukan versi Python itu sendiri. Dokumentasi SQL lengkapnya tersedia di https://www.sqlite.org/docs.html .

DuckDB: Analitik via pip #

DuckDB dipasang seperti pustaka Python biasa, cukup pip install duckdb di dalam venv. Setelah terpasang, verifikasi dengan atribut __version__:

bash
python3 -c "import duckdb; print(duckdb.__version__)"

Output yang Dihasilkan:

text
1.5.6

DuckDB dirancang untuk query analitik: agregasi jutaan baris, window function, hingga membaca berkas Parquet dan CSV langsung dari disk tanpa memuat seluruh isi ke memori. Dokumentasi resminya ada di https://duckdb.org/docs/ .

Verifikasi Koneksi dengan Satu Skrip #

Kedua database embedded tersebut dapat diuji sekaligus lewat skrip pendek berikut, yang membuat database in-memory (tidak menulis berkas apa pun), lalu menjalankan query SELECT sederhana:

python
import sqlite3
import duckdb

# --- Uji SQLite: database in-memory, tanpa berkas ---
koneksi_sqlite = sqlite3.connect(":memory:")
koneksi_sqlite.execute("CREATE TABLE kota (nama TEXT, penduduk INTEGER)")
koneksi_sqlite.execute("INSERT INTO kota VALUES ('Bandung', 2500000)")
hasil_sqlite = koneksi_sqlite.execute("SELECT nama, penduduk FROM kota").fetchall()
print("SQLite :", sqlite3.sqlite_version, "->", hasil_sqlite)

# --- Uji DuckDB: database in-memory untuk beban analitik ---
koneksi_duck = duckdb.connect()
koneksi_duck.execute("CREATE TABLE penjualan (produk TEXT, jumlah INTEGER)")
koneksi_duck.execute("INSERT INTO penjualan VALUES ('gula', 120), ('kopi', 85)")
hasil_duck = koneksi_duck.execute(
    "SELECT produk, jumlah FROM penjualan ORDER BY jumlah DESC"
).fetchall()
print("DuckDB :", duckdb.__version__, "->", hasil_duck)

Output yang Dihasilkan:

text
SQLite : 3.53.1 -> [('Bandung', 2500000)]
DuckDB : 1.5.6 -> [('gula', 120), ('kopi', 85)]

Mari kita telaah baris-baris kode di atas:

  1. Baris 5 (koneksi_sqlite = sqlite3.connect(":memory:")): string khusus ":memory:" memerintahkan SQLite membuat database di dalam memori — data hilang saat skrip selesai, ideal untuk latihan.
  2. Baris 6-8: tiga pernyataan SQL standar membuat tabel, menyisipkan satu baris, lalu mengambil hasilnya dengan fetchall() dalam bentuk daftar tuple.
  3. Baris 13 (koneksi_duck = duckdb.connect()): DuckDB tanpa argumen juga membuka database in-memory; untuk menyimpan permanen, berikan nama berkas misalnya duckdb.connect("analitik.duckdb").
  4. Baris 16-18: query yang sama berjalan di DuckDB; perhatikan satu INSERT dapat memuat dua baris sekaligus lewat VALUES ('gula', 120), ('kopi', 85).

PostgreSQL untuk Skenario Produksi #

PostgreSQL adalah pilihan paling umum untuk database transaksional di dunia nyata. Di Ubuntu/Debian, pemasangan dilakukan lewat apt:

bash
sudo apt update
sudo apt install postgresql postgresql-client

Setelah pemasangan, layanan PostgreSQL berjalan sebagai server di latar belakang. Perintah-perintah berikut berjalan di sistem dengan PostgreSQL terpasang — lingkungan penulisan tidak memasang server PostgreSQL, sehingga kita tidak menyertakan contoh keluarannya:

bash
psql --version
sudo systemctl status postgresql
sudo -u postgres psql -c "SELECT version();"

Perintah pertama memeriksa versi klien psql, perintah kedua memastikan layanan server berjalan, dan perintah ketiga menjalankan query SELECT version(); sebagai pengguna bawaan postgres. Alternatif tanpa menyentuh sistem operasi: jalankan PostgreSQL sebagai container Docker, cara yang kita bahas di chapter Pengenalan Docker. Dokumentasi resmi PostgreSQL tersedia di https://www.postgresql.org/docs/ .

Database siap, tetapi hampir semua pekerjaan data engineering dimulai dari terminal: memindai berkas, memfilter log, dan merangkai perintah. Keterampilan tersebut kita latih pada chapter Penggunaan Command Line.