Sepanjang course ini kita telah mempelajari validasi, pembersihan, deduplikasi, pemuatan, logging, dan pengujian sebagai potongan konsep yang terpisah. Pada proyek pertama ini kita merangkai seluruh potongan tersebut menjadi satu pipeline yang benar-benar bekerja: membaca berkas CSV mentah, memvalidasi setiap baris, membersihkan nilai yang belum normal, membuang duplikat, lalu memuat hasilnya ke tabel database. Studi kasusnya adalah pesanan toko daring fiktif TokoKita yang mengekspor data penjualan setiap bulan dalam format CSV.
Proyek ini dikerjakan dalam sembilan bagian berurutan. Setiap bagian menambah satu lapisan kemampuan, dan setiap lapisan diuji dengan pytest sebelum kita lanjut. Seluruh kode sumber tersedia pada bagian Berkas Sumber di bawah halaman ini, dan setiap bagian merujuk ke berkas yang sama sehingga kondisi proyek tetap utuh di setiap tahap.
Cerita Proyek #
TokoKita adalah toko daring kecil yang sistem ordernya masih warisan lama. Setiap akhir bulan, sistem tersebut mengekspor seluruh pesanan menjadi berkas CSV dan menaruhnya di folder yang sama. Tim analitik ingin tabel pesanan yang dapat dipercaya: satu baris per pesanan, tanpa duplikat, dengan tipe data yang benar.
Audit cepat terhadap dua berkas ekspor terakhir menemukan beberapa jenis kotoran yang khas:
- baris ganda akibat sistem mengekspor ulang pesanan yang sama,
- nilai kosong pada kolom wajib seperti email dan tanggal,
- format yang bervariasi:
selesaivsSELESAI,210.000vs210000, - nilai yang mustahil: jumlah negatif, harga negatif, tanggal
2024-06-31.
Arsitektur Pipeline #
Alur yang kita bangun mengikuti pola baca, validasi, bersihkan, deduplikasi, muat:
Tahap validasi menolak baris yang tidak dapat diselamatkan. Tahap pembersihan menormalkan baris yang lolos tetapi belum rapi. Tahap deduplikasi memastikan satu pesanan hanya muncul sekali, termasuk saat pesanan yang sama diekspor ulang pada berkas bulan berikutnya.
Tahapan Pengerjaan #
| Bagian | Fokus | Berkas utama |
|---|---|---|
| 1 | Memahami kebutuhan dan audit data | data/pesanan_2024-06.csv |
| 2 | Merancang skema database | config/schema.sql |
| 3 | Membaca dan memvalidasi CSV | src/validate.py |
| 4 | Membersihkan data | src/clean.py |
| 5 | Memuat data ke PostgreSQL | src/load.py, src/loader_postgres.py |
| 6 | Menangani data duplikat | src/dedup.py |
| 7 | Menambahkan logging | src/logging_setup.py |
| 8 | Menguji pipeline | tests/ |
| 9 | Menjalankan pipeline | python3 -m src.pipeline |
Mulailah dari Bagian 1 dan kerjakan sesuai urutan, karena setiap bagian dibangun di atas keputusan bagian sebelumnya.
Peta Berkas Proyek #
pipeline-data-csv-ke-postgresql/
├── _index.md
├── part-1..part-9/index.md
├── data/
│ ├── pesanan_2024-06.csv (mentah, 107 baris)
│ ├── pesanan_2024-07.csv (mentah, 111 baris)
│ └── processed/ (hasil pipeline: CSV bersih, log, basisdata)
├── src/ (validate, clean, dedup, load, logging_setup,
│ pipeline, loader_postgres)
├── tests/ (5 berkas pytest, 89 pengujian)
└── config/ (schema.sql, pipeline.yaml, database.example.yaml)Cara Menjalankan Proyek #
Semua perintah dijalankan dari direktori root proyek. Kebutuhan lingkungan: Python 3.12, pytest, dan PyYAML (semuanya sudah tersedia di lingkungan tutorial).
# jalankan seluruh pengujian
python3 -m pytest tests/ -q
# jalankan pipeline dari awal sampai akhir
python3 -m src.pipelinePipeline membaca config/pipeline.yaml untuk nilai bawaan; opsi baris perintah seperti --db dan --level selalu menimpa nilai berkas tersebut.
Catatan tentang PostgreSQL #
Skema dan pemuatan ditulis untuk PostgreSQL: SERIAL, ON CONFLICT, RETURNING, serta constraint CHECK dan UNIQUE.
Rujukan teknis yang dipakai proyek ini: dokumentasi modul csv Python dan dokumentasi PostgreSQL .
Setelah memahami bentuk akhir proyek, mari kita mulai dari hal yang paling menentukan: apa sebenarnya yang dibutuhkan TokoKita. Lanjutkan ke Bagian 1: Memahami Kebutuhan.
Petakan masalah bisnis TokoKita menjadi kebutuhan pipeline yang terukur sebelum menulis satu baris kode.
Buka → # Bagian 2: Merancang Skema DatabaseTurunkan kolom CSV menjadi tabel pesanan dengan tipe, constraint, dan index yang menegakkan aturan sejak tingkat database.
Buka → # Bagian 3: Membaca dan Memvalidasi CSVBaca berkas CSV dengan DictReader dan tolak baris bermasalah dengan aturan yang terukur dan tercatat.
Buka → # Bagian 4: Membersihkan DataNormalkan baris yang lolos validasi: kapitalisasi konsisten, spasi dirapikan, dan angka dikembalikan ke tipe aslinya.
Buka → # Bagian 5: Memuat Data ke PostgreSQLMuat baris bersih dengan UPSERT per batch agar pemuatan ulang tidak pernah menambah baris.
Buka → # Bagian 6: Menangani Data DuplikatBuang duplikat persis dan tangani konflik kunci dengan kebijakan kemunculan pertama yang deterministik.
Buka → # Bagian 7: Menambahkan LoggingPasang logger standar pada seluruh tahap pipeline sehingga setiap keputusan dapat ditelusuri dari log.
Buka → # Bagian 8: Menguji PipelineUji setiap lapisan pipeline dengan pytest: fungsi murni, pemuatan ke basisdata sementara, dan end-to-end dari CSV sampai tabel.
Buka → # Bagian 9: Menjalankan PipelineJalankan pipeline utuh pada data asli, verifikasi isi tabel, dan tinjau kembali seluruh kriteria keberhasilan Bagian 1.
Buka →