#!/usr/bin/env bash # ============================================================================= # eBdesk SiCABE — Seed Sumber PostgreSQL: sicabe_data.public.orders # ============================================================================= # Membuat database `sicabe_data` + tabel `public.orders` (8 kolom, konsisten # dengan dbt sources.yml dan tabel Iceberg `bronze.orders`) lalu mengisinya # dengan 6 baris contoh. # # Tabel ini adalah SUMBER untuk tugas DAG `sicabe_batch_daily.ingest_to_bronze` # (Sling: POSTGRES_DB.public.orders → ICEBERG bronze.orders). # # CATATAN: `scripts/seed-sample-data.sh` mengisi sisi Iceberg (bronze.orders) # secara langsung — script INI mengisi sisi PostgreSQL (sumbernya), sehingga # jalur Sling → Iceberg → dbt → GE dapat berjalan end-to-end. # # Idempoten: aman dijalankan berulang (CREATE ... IF NOT EXISTS; INSERT hanya # bila tabel kosong). # # Pemakaian: # cd deploy # ./scripts/seed-source-postgres.sh # # Env opsional (ada default): # PG_CONTAINER (sicabe-postgres), SEED_SOURCE_DB (sicabe_data), # SEED_SOURCE_TABLE (orders), POSTGRES_USER (sicabe_admin) # ============================================================================= set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # shellcheck source=../lib/common.sh source "${SCRIPT_DIR}/lib/common.sh" # shellcheck source=../config/environment.defaults.sh source "${SCRIPT_DIR}/config/environment.defaults.sh" sicabe_load_env "${SCRIPT_DIR}" "$@" PG_CONTAINER="${PG_CONTAINER:-sicabe-postgres}" SEED_DB="${SEED_SOURCE_DB:-sicabe_data}" SEED_TABLE="${SEED_SOURCE_TABLE:-orders}" PG_USER="${POSTGRES_USER:-sicabe_admin}" # Multi-host: PostgreSQL ada di host `state` dan `docker exec` bersifat lokal → # bila bukan di host ini, beri instruksi & keluar rapi (kode 3), bukan gagal. sicabe_require_local_container "${PG_CONTAINER}" "PostgreSQL" "state" || exit $? on_err() { echo -e "${ERR} Gagal pada baris $1."; exit 1; } trap 'on_err $LINENO' ERR # psql di dalam container (tanpa password: koneksi lokal container). pg() { docker exec -i "${PG_CONTAINER}" psql -v ON_ERROR_STOP=1 -qtA -U "${PG_USER}" "$@"; } echo -e "${BOLD}${BLUE}=== Seed Sumber PostgreSQL: ${SEED_DB}.public.${SEED_TABLE} ===${NC}" # ─── [1/3] Database ───────────────────────────────────────────────────────── echo -e "${INFO} [1/3] Database '${SEED_DB}'..." if [[ "$(pg -d postgres -c "SELECT 1 FROM pg_database WHERE datname='${SEED_DB}'")" == "1" ]]; then echo -e "${OK} Database '${SEED_DB}' sudah ada." else pg -d postgres -c "CREATE DATABASE ${SEED_DB} OWNER ${PG_USER}" >/dev/null echo -e "${OK} Database '${SEED_DB}' dibuat." fi # ─── [2/3] Tabel sumber ───────────────────────────────────────────────────── echo -e "${INFO} [2/3] Tabel 'public.${SEED_TABLE}'..." pg -d "${SEED_DB}" -c "CREATE TABLE IF NOT EXISTS public.${SEED_TABLE} ( id bigint PRIMARY KEY, order_date date, komoditas varchar(64), harga_per_kg double precision, stok_kg bigint, region varchar(64), created_at timestamp, updated_at timestamp )" >/dev/null echo -e "${OK} Tabel 'public.${SEED_TABLE}' siap." # ─── [3/3] Data contoh ────────────────────────────────────────────────────── echo -e "${INFO} [3/3] Data contoh (bila kosong)..." COUNT="$(pg -d "${SEED_DB}" -c "SELECT count(*) FROM public.${SEED_TABLE}")" if [[ "${COUNT}" -gt 0 ]]; then echo -e "${OK} Sudah berisi ${COUNT} baris (skip seed)." else pg -d "${SEED_DB}" -c "INSERT INTO public.${SEED_TABLE} VALUES (1, DATE '2026-09-01', 'beras', 12000.0, 500, 'jakarta', TIMESTAMP '2026-09-01 08:00:00', TIMESTAMP '2026-09-01 08:00:00'), (2, DATE '2026-09-01', 'gula', 15000.0, 300, 'bandung', TIMESTAMP '2026-09-01 09:00:00', TIMESTAMP '2026-09-01 09:00:00'), (3, DATE '2026-09-02', 'minyak', 18000.0, 200, 'surabaya', TIMESTAMP '2026-09-02 08:00:00', TIMESTAMP '2026-09-02 08:00:00'), (4, DATE '2026-09-02', 'beras', 12500.0, 450, 'jakarta', TIMESTAMP '2026-09-02 10:00:00', TIMESTAMP '2026-09-02 10:00:00'), (5, DATE '2026-09-03', 'tepung', 11000.0, 350, 'medan', TIMESTAMP '2026-09-03 08:00:00', TIMESTAMP '2026-09-03 08:00:00'), (6, DATE '2026-09-03', 'gula', 15500.0, 250, 'bandung', TIMESTAMP '2026-09-03 11:00:00', TIMESTAMP '2026-09-03 11:00:00')" >/dev/null echo -e "${OK} 6 baris contoh dimasukkan." fi # ─── Verifikasi ───────────────────────────────────────────────────────────── echo -e "${INFO} Verifikasi (sumber PostgreSQL):" pg -d "${SEED_DB}" -c "SELECT id, order_date, komoditas, harga_per_kg, stok_kg, region FROM public.${SEED_TABLE} ORDER BY id" \ | while IFS='|' read -r a b c d e f; do printf ' %-3s %-12s %-8s %-10s %-6s %s\n' "$a" "$b" "$c" "$d" "$e" "$f"; done echo -e "${OK} Selesai. Lanjutkan dengan DAG 'sicabe_batch_daily' (task ingest_to_bronze)."