sql
Catatan teknis seputar web development, DevOps, dan integrasi AI.
29 artikel
- 03.30backend
Re-Parent Satu Kategori, Tree-nya Ikut Nyiklus
Validasi parent yang cuma ngecek self-parent itu ilusi: re-parent ke keturunan sendiri diam-diam bikin siklus, dan MySQL 5.7 nggak punya CTE cycle avoidance.
TL;DR: Mindahin A jadi anak B bikin siklus karena B itu anaknya A, validasi lama cuma cek parent bukan diri sendiri. Sekarang validateCategory manjat ngecek leluhur satu-satu pakai GetCategoryByID dan errors.Is sampai root, kalau id sama ya ditolak. Biar gak muter terus kalau data lama udah rusak, jalurnya dibatasin cuma sepuluh level aja.
#golang#mysql#backend - 03.19testing
Kategori CRUD Sudah Jadi, Test-nya Nol
Fitur kategori bertingkat udah hidup tanpa satu pun test: env boot ternyata kontrak, dan edge constraint cuma bisa divalidasi lawan MySQL beneran.
TL;DR: Awalnya fitur kategori bertingkat udah jadi tapi belum ada test sama sekali jadi kelihatan hijau palsu. Terus gue benerin TestHealthEndpoint yang gagal boot karena env belum di-set pakai Setenv plus nambah tiga test integrasi buat cek constraint hapus parent/child di MySQL asli. Testnya dikunci tag integration dan harus jalan pakai -p 1 biar nggak rebutan database barengan.
#golang#testing#mysql - 03.09devops
Arah DB Dibalik, Semua Asumsi Safety Ikut Terbalik
Membalik arah db-push jadi db-pull bukan cuma menukar panah: backup lokal dulu, dump divalidasi sebelum dipercaya, aturan backtick berubah di SSH.
TL;DR: Bikin script db-pull tuh ngeri karena yang ketimpa database lokal, bukan staging lagi. Makanya urutannya dibalik, wajib backup lokal dulu, terus dump staging dicek ukuran sama tanda Dump completed baru di-replace. Terus verifikasinya ketat banget, hitung baris tiap tabel harus sama persis, backtick juga diakalin biar aman di SSH.
#mysql#bash#docker - 09.47backend
Ganti URL database WordPress pakai WP-CLI, bukan SQL mentah
WP_HOME cuma menipu halaman baru; URL lama menempel di database. WP-CLI search-replace dengan dry-run dan skip-columns=guid solusinya.
TL;DR: Pindahin dump WP produksi ke lokal ternyata nggak cukup cuma ganti WP_HOME dan WP_SITEURL, soal URL lama masih nempel di mana-mana, apalagi yang format serialized. Jangan asal REPLACE() via SQL, bisa merusak serialized dan kena limit panjang kolom. Paling aman pakai wp search-replace, dry-run dulu, dan skip kolom guid biar identitas postingan aman.
#wordpress#wp-cli#php - 12.19backend
Field Turunan Saya Basi Lagi, Tiga Hari Setelah Di-Backfill
Commit backfill next_review basi lagi tiga hari kemudian. Solusinya: field turunan dihitung saat dibaca, nilai manual tetap dipertahankan.
TL;DR: Gue ngabisin waktu backfill manual field next_review, eh besoknya datanya basi cuma gara-gara satu berkas baru. Ternyata itu field turunan yang bisa dihitung sendiri dari last_updated plus 90 hari, jadi mending derive pas dibaca, gak perlu disimpen. SQLite sama PostgreSQL aja udah setuju lewat generated column dan view; nyimpen cuma worth it kalau ada override manual atau bacaannya berat banget.
#python#sqlite#postgresql - 02.47devops
Backup Database Aktif Itu Nggak Boleh Sekadar Cp
Menyalin file SQLite yang aktif bukan backup. Pelajaran dari script backup ringan: hot backup, tar atomik terverifikasi, dan prune berlapis.
TL;DR: Script ini menyalin SQLite aktif lewat perintah .backup, bukan cp mentah, supaya snapshot tetap konsisten di mode WAL. Arsip ditulis ke nama sementara, diverifikasi dengan tar -tzf, baru direname atomik, jadi tidak ada arsip setengah jadi. Penghapusan lama baru jalan setelah verify, dengan lantai minimal tiga arsip terbaru plus flock biar cron nggak dobel.
#backup#sqlite#cron - 11.40backend
Upsert Idempoten di Entrypoint, Biar Data Chat Gak Selisih Lagi
Data baseline chat bot lokal dan VPS selisih karena seeding manual. Solusinya: seed JSON di repo di-upsert via entrypoint container.
TL;DR: Data knowledge di VPS kurang karena baseline diisi lewat copy-paste SQL manual yang rawan kelewat baris. Solusinya: seed file di repo di-upsert otomatis tiap container start pakai INSERT ON DUPLICATE KEY UPDATE dengan slug sebagai kunci alami. Pelajarannya: affected-rows 2 berarti update satu baris, dan dev-prod sebaiknya parity agar bug serupa tidak lolos.
#mariadb#docker#python - 00.53frontend
Metadata hasil chat diangkat dari SQL sampai popup
Chip waktu dan tag di popup chat ternyata bukan urusan CSS. Metadata harus naik dulu dari SQL sampai DTO sebelum UI bisa bergaya.
TL;DR: Popup search kelihatan datar bukan karena CSS, tapi karena API nggak mengirim tags, categories, dan published_at dari database. Solusinya: naikkan metadata itu lewat SQL, domain, sampai DTO, baru frontend merender. Setelah pipeline utuh, TimelineRow dipakai ulang di tiga konteks popup dengan chip waktu, ikon teknologi, dan badge sitasi.
#react#pydantic#sqlmodel - 11.04backend
TL;DR Kartu Blog tanpa N+1 Query
Satu field kecil di halaman list nyaris memicu satu query per artikel. Solusinya satu query batch IN, tetap dua query per halaman.
#python#fastapi#mariadb