sqlalchemy
Catatan teknis seputar web development, DevOps, dan integrasi AI.
6 artikel
- 18.57database
Satu Aturan, Satu Tempat: Identitas Email dalam Skema Basis Data
Dua constraint menjaga satu aturan identitas email. Menghapus yang redundan ternyata bukan kosmetik, melainkan menutup celah spesifikasi ganda.
TL;DR: Migrasi ini cuma ngehapus constraint komposit tenant-email dan ganti email jadi unique, intinya satu aturan mending ditulis sekali aja. Soalnya dua spesifikasi buat aturan yang sama itu bahaya—pas aturan berubah, yang lama bisa balik nyala diam-diam. Verifikasinya aman: roundtrip migrasi bersih, autogenerate nggak nemu drift, dan insert duplikat lintas tenant tetap ditolak database.
#postgresql#alembic#sqlalchemy - 17.37backend
Content Hash sebagai Identitas Observasi dalam Pipeline Ingest
Observasi yang sama tercatat dua kali hanya karena nama ditulis berbeda. Content hash dari tuple kanonik menutup celah duplikasi itu.
TL;DR: Pipeline sempat ngitung dobel gara-gara nama PT ditulis beda titik sama spasi padahal perusahaannya sama. Makanya dibikin normalize_company buat beresin nama plus content_hash_for yang nge-hash tuple kanonik pakai SHA-256 biar identitasnya konsisten. Terus di database dikunci pakai UniqueConstraint dan ON CONFLICT biar duplikat nggak lolos lagi.
#postgresql#python#sqlalchemy - 23.04backend
CI merah karena schema kosong: migrasi dulu, baru pytest
Pipeline CI gagal pada database service yang masih kosong; satu baris alembic upgrade head sebelum pytest menyelaraskan kontrak CI dengan container produksi.
TL;DR: Pipeline CI jadi merah gara-gara database kosong, bukan karena kode error—ternyata migrasi nggak pernah jalan di CI. Solusinya gampang, tinggal tambahin alembic upgrade head sebelum pytest biar urutannya sama kayak produksi: schema dulu, baru tes. Sekarang error yang muncul beneran nunjukin bug kode, bukan tabel yang belum dibuat, jadi debugging nggak buang waktu lagi.
#ci#alembic#pytest - 17.07backend
Skeleton FastAPI: Kontrak Lapis, Bukan Sekadar Folder Kosong
Empat folder berisi init.py kosong ternyata memegang kontrak lapisan, unit of work per request, dan titik integrasi multi-tenant yang menjaga skeleton tetap sehat.
TL;DR: Bikin empat folder kosong buat DemandScope keliatan males banget, padahal itu kontrak per lapisan biar logika nggak bocor. Commit-nya pake dependency yield, jadi request gagal auto rollback dan tenant sama user kebikin atomik. Multi-tenancy diatur via JWT, batas bcrypt dijaga Pydantic, terus NoopSource tinggal disambung pas butuh aja.
#fastapi#python#jwt - 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 - 10.34backend
Parameter Query SQLAlchemy yang Nggak Mau Ekstra
Filter locale opsional bikin live search zonk di locale default. Pelajaran soal text() SQLAlchemy, bindparams, dan klausa yang harus kompak.
#python#fastapi#mariadb