{"id":27414390,"url":"https://github.com/yeahbutstill/belajar-postgre","last_synced_at":"2026-05-17T02:41:57.135Z","repository":{"id":153009822,"uuid":"625340637","full_name":"yeahbutstill/belajar-postgre","owner":"yeahbutstill","description":"ayoooooo belajar","archived":false,"fork":false,"pushed_at":"2024-08-14T05:37:23.000Z","size":516,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-21T23:02:00.925Z","etag":null,"topics":["database-objects","postgresql","python","sql"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yeahbutstill.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-08T20:11:32.000Z","updated_at":"2024-08-14T05:53:00.000Z","dependencies_parsed_at":"2024-08-04T10:29:22.778Z","dependency_job_id":"8efdb5c6-495b-47e8-9d3f-000648c16d86","html_url":"https://github.com/yeahbutstill/belajar-postgre","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yeahbutstill/belajar-postgre","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeahbutstill%2Fbelajar-postgre","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeahbutstill%2Fbelajar-postgre/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeahbutstill%2Fbelajar-postgre/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeahbutstill%2Fbelajar-postgre/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yeahbutstill","download_url":"https://codeload.github.com/yeahbutstill/belajar-postgre/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yeahbutstill%2Fbelajar-postgre/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33125519,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T18:38:32.183Z","status":"online","status_checked_at":"2026-05-17T02:00:05.366Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-objects","postgresql","python","sql"],"created_at":"2025-04-14T08:24:52.901Z","updated_at":"2026-05-17T02:41:57.097Z","avatar_url":"https://github.com/yeahbutstill.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Belajar PostgreSQL Database\nMenggunakan Relational database management system (RDBMS)\n\n## Running PostgreSQL in Docker\nUntuk menjalankan PostgreSQL di Docker ini sebetulnya sangatlah mudah, kita cukup jalankan perintah\n```shell\ndocker run --rm \\      \n--name book_catalog-db \\\n-e POSTGRES_PASSWORD=belajaryuk \\\n-e PGDATA=/var/lib/postgresql/data/pgdata \\\n-v \"$PWD/belajar-db-data:/var/lib/postgresql/data\" \\\n-p 5432:5432 \\\npostgres:16.3-alpine3.20\n```\n\n## Menjalankan dengan Docker Compose\n```shell\ndocker compose config ### map env\ndocker compose -f compose.yaml --env-file .env --profile debug up\ndocker compose exec postgres psql -U postgres -W ### login\n```\n\n## Create User\n```shell\n-- create user schema database\nCREATE USER hr WITH SUPERUSER LOGIN PASSWORD 'hr';\n\n-- create database\nCREATE DATABASE hr WITH OWNER hr;\n```\n\n## Run migrationnya dengan perintah\n```shell\ndocker compose \\\n-f compose.yaml \\\n--env-file .env \\\n--profile migrate up\n```\nJika sudah sekarang kita bisa check dengan perintah berikut:\n```shell\ndocker compose \\\n-f compose.yaml \\\n--env-file .env \\\nexec postgres psql -U hr -W -c \"\\dt\"\n```\ncoba kita hapus\n```shell\ndocker compose down --volumes\n#### lalu jalankan lagi\ndocker compose --profile migrate up\n#### lalu login kembali menggunakan user hr\ndocker compose \\\n-f compose.yaml \\\n--env-file .env \\\nexec postgres psql -U hr -W\n```\n\n## Backup\n```shell\ndocker compose \\           \n-f compose.yaml \\\n--env-file .env \\\nexec postgres pg_dump -U hr -W -d hr --no-privileges --insert --encoding utf8 -h localhost\u003e backup/hr-09-04-23.sql\n```\n\n## Create database\n```shell\ndocker compose \\           \n-f compose.yaml \\\n--env-file .env \\\nexec postgres createdb -U hr -W hr_temp \n```\n\n## Restore\n```shell\ndocker compose exec postgres psql -U hr -d hr -W -d hr_temp -f backup/hr-09-04-23.sql \n```\n\n## Run PgAdmin4\n```shell\ndocker compose \\                                                                                                          \n-f compose.yaml \\\n--env-file .env \\\n--profile debug up\n```\n# CDC dengan Debezium, Kafka, Postgres, Docker\n\n## Ringkasan\n\nSkrip Python ini dirancang untuk menghasilkan simulasi transaksi keuangan dan memasukkannya ke dalam database PostgreSQL. Ini sangat berguna untuk menyiapkan lingkungan pengujian untuk Change Data Capture (CDC) dengan Debezium. Skrip ini menggunakan pustaka `faker` untuk membuat data transaksi yang realistis namun fiktif dan memasukkannya ke dalam tabel PostgreSQL.\n\n## Prasyarat\n\nSebelum menjalankan skrip ini, pastikan Anda telah menginstal yang berikut ini:\n-Python 3.9+\n- Perpustakaan `psycopg2` untuk Python\n- Perpustakaan `faker` untuk Python\n- Server PostgreSQL berjalan secara lokal atau dapat diakses dari jarak jauh\n- Docker dan Docker Compose diinstal pada mesin Anda.\n- Pemahaman dasar tentang Docker, Kafka, dan Postgres.\n\n## Instalasi\n\n1. **Instal Library Python yang Diperlukan:**\n\nAnda dapat menginstal perpustakaan yang diperlukan menggunakan pip:\n\n ```bash\n pip install psycopg2-binary faker\n ```\n\n## Layanan di File Tulis\n\n- **Zookeeper:** Layanan terpusat untuk memelihara informasi konfigurasi, memberi nama, menyediakan sinkronisasi terdistribusi, dan menyediakan layanan grup.\n- **Kafka Broker:** Platform streaming terdistribusi yang digunakan di sini untuk menangani umpan data waktu nyata.\n- **Confluent Control Center:** Alat berbasis web untuk mengelola dan memantau Apache Kafka.\n- **Debezium:** Platform terdistribusi sumber terbuka untuk pengambilan data perubahan.\n- **Debezium UI:** Antarmuka pengguna untuk mengelola dan memantau konektor Debezium.\n- **Postgres:** Database relasional sumber terbuka.\n\n## Getting Started\n\n1. **Kloning Repositori:**\n   Pastikan Anda memiliki file Docker Compose ini di sistem lokal Anda. Jika itu bagian dari repositori, kloning repositori tersebut ke mesin lokal Anda.\n\n2. **Navigasi ke Direktori:**\n   Buka terminal dan navigasikan ke direktori yang berisi file Docker Compose.\n\n3. **Jalankan Docker Compose:**\n   Jalankan perintah berikut untuk memulai semua layanan yang ditentukan dalam file Docker Compose:\n\n ```bash\n docker compose up -d\n ```\n\nPerintah ini akan mengunduh image Docker yang diperlukan, membuat container, dan memulai layanan dalam mode terpisah.\n\n4. **Verifikasi Layanan:**\n   Periksa apakah semua layanan aktif dan berjalan:\n\n ```bash\n docker compose ps\n ```\n\nAnda akan melihat semua layanan terdaftar sebagai 'running'.\n\n5. **Mengakses Layanan:**\n- Pusat Kontrol Kafka dapat diakses di `http://localhost:9021`.\n- Debezium UI dapat diakses di `http://localhost:8080`.\n- Postgres dapat diakses pada port default `5432`.\n\nJangan lupa ubah replica indentity full ke table-table kalian\n```sql\nalter table transactions replica identity full;\n```\n\nSetelah itu daftarkan konektor Database ke Debezium melalu API Debezium dengan Postman kita arahkan ke URL http://localhost:8093/connectors\n\nisi Bodynya:\n```json\n{\n  \"name\": \"postgres-connector-hr\",\n  \"config\": {\n    \"connector.class\": \"io.debezium.connector.postgresql.PostgresConnector\",\n    \"plugin.name\": \"pgoutput\",\n    \"database.hostname\": \"postgres\",\n    \"database.port\": \"5432\",\n    \"database.user\": \"hr\",\n    \"database.password\": \"hr\",\n    \"database.dbname\": \"hr\",\n    \"database.server.name\": \"postgres\",\n    \"table.include.list\": \"public.transactions, public.countries, public.departments, public.employes, public.flyway_schema_history, public.job_history, public.jobs, public.locations, public.regions\",\n    \"topic.prefix\": \"hr-cdc\",\n    \"decimal.handling.mode\": \"string\"\n  }\n}\n```\n\nSelanjutnya masuk ke database hr, lalu tambahkan column ini:\n```sql\nalter table transactions add column modified_by text;\nalter table transactions add column modified_at timestamp;\n```\n\nlanjut buat functionnya:\n```sql\ncreate or replace function record_change_user()\nreturns trigger as $$\n\nbegin\n\nnew.modified_by := current_user;\nnew.modified_at := current_timestamp;\nreturn new;\n    \nend;\n\n$$ language plpgsql;\n\n```\n\nbuat triggernya:\n```sql\ncreate trigger trigger_record_user_update\nbefore update on transactions\nfor each row execute function record_change_user();\n```\n\nhapus trigger:\n```sql\ndrop trigger trigger_record_user_update on transactions;\n```\n\nBuat function change column dengan format json:\n```sql\n-- capture the changes to specific columns into json object\nCREATE OR REPLACE FUNCTION record_changed_columns()\nRETURNS TRIGGER AS $$\nDECLARE\n    change_details JSONB;\nBEGIN\n    NEW.modified_by := current_user;\n    NEW.modified_at := CURRENT_TIMESTAMP;\n\n    change_details := '{}'::JSONB; -- Initialize an empty JSONB object\n\n    -- Check each column for changes and record as necessary\n    IF NEW.amount IS DISTINCT FROM OLD.amount THEN\n        change_details := jsonb_insert(change_details, '{amount}', jsonb_build_object('old', OLD.amount, 'new', NEW.amount));\n    END IF;\n\n    -- Add user and timestamp\n    change_details := change_details || jsonb_build_object('modified_by', current_user, 'modified_at', now());\n\n    -- Update the change_info column\n    NEW.change_info := change_details;\n\n    RETURN NEW;\nEND;\n$$ LANGUAGE plpgsql;\n```\n\njangan lupa buat triggernya:\n```sql\ncreate trigger trigger_record_change_info\nbefore update on transactions\nfor each row execute function record_change_columns();\n```\n\n6. **Shutting Down:**\n   Untuk menghentikan dan menghapus kontainer, jaringan, dan volume, jalankan:\n\n ```bash\n docker compose down\n ```\n\n## Kustomisasi\nAnda dapat memodifikasi file Docker Compose sesuai kebutuhan Anda. Misalnya, Anda mungkin ingin mempertahankan data di Postgres dengan menambahkan volume untuk layanan Postgres.\n\n## Catatan\nPengaturan ini dimaksudkan untuk tujuan pengembangan dan pengujian. Untuk lingkungan produksi, pertimbangkan faktor tambahan seperti keamanan, skalabilitas, dan persistensi data.\n\n## Soal\n### Questions for this assignment\n- Buatlah query untuk menampilkan seluruh data karyawan dari table employees yang diurutkan berdasarkan email paling terakhir.\n  ```sql\n  SELECT *\n  FROM employees\n  ORDER BY email DESC;\n  ```\n  \n- Buatlah query untuk menampilkan data karyawan yang gajinya lebih besar 3200.00 sampai dengan 12000.00\n  ```sql\n  SELECT *\n  FROM employees\n  WHERE salary BETWEEN 3200 AND 12000;\n  ```\n  \n- Buatlah query untuk menampilkan data karyawan yang memiliki huruf A diawal nama depannya.\n  1. Menggunakan substring function\n  ```sql\n  SELECT *\n  FROM employees\n  WHERE substr(first_name, 1, 1) ='A';\n  ```\n  2. Menggunakan like operators\n  ```sql\n  SELECT *\n  FROM employees\n  WHERE first_name LIKE 'A%';\n  ```\n\n- Buatlah query untuk menampilkan data karyawan yang memiliki kode karyawan diantaranya 103, 115, 196, 187, 102 dan 100\n  ```sql\n  SELECT * FROM employees\n  WHERE employee_id IN (103, 115, 196, 187, 102, 100);\n  ```\n- Buatlah query untuk menampilkan data karyawan yang nama belakangnya memiliki huruf kedua u.\n  1. Menggunakan substring function\n  ```sql\n  SELECT *\n  FROM employees\n  WHERE substr(last_name, 2, 1) = 'u';\n  ```\n  2. Menggunakan like operators\n  ```sql\n  SELECT *\n  FROM employees\n  WHERE last_name LIKE'_u%';\n  ```\n  \n- Buatlah query untuk menampilkan kode department apa saja yang ada di tabel employees secara unique\n  ```sql\n  SELECT DISTINCT department_id FROM employees;\n  ```\n  \n- Buatlah query untuk menampilkan nama lengkap karyawan, kode jabatan, gaji setahun dari table employees yang kode manager sama dengan 100.\n  ```sql\n  SELECT concat(first_name, ' ', last_name) AS \"NAMA LENGKAP\",\n       job_id AS \"KODE JABATAN\",\n       salary * 12 AS \"GAJI SETAHUN\"\n  FROM employees\n  WHERE manager_id = 100;\n  ```\n  \n- Buatlah query untuk menampilkan nama belakang, gaji perbulan, kode jabatan dari table employees yang tidak memiliki komisi\n  ```sql\n  SELECT last_name \"NAMA BELAKANG\",\n       salary \"GAJI SEBULAN\",\n       job_id \"KODE JABATAN\"\n  FROM employees\n  WHERE commission_pct IS NULL;\n  ```\n  \n- Buatlah query untuk menampilkan data karyawan yang bukan dari jabatan IT_PROG dan SH_CLERK.\n  ```sql\n  SELECT *\n  FROM employees\n  WHERE job_id NOT IN ('IT_PROG', 'SH_CLERK');\n  ```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeahbutstill%2Fbelajar-postgre","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyeahbutstill%2Fbelajar-postgre","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyeahbutstill%2Fbelajar-postgre/lists"}