Data: Database dan SQL · 7/7
ORM, query builder, dan migration
Apa yang kamu dapat dari ORM dan apa yang disembunyikannya, plus cara mengubah skema dengan aman di sistem live.
Baca 30 menit
Setelah pelajaran ini kamu bisa
- Menyebutkan apa yang diberikan ORM dan apa yang disembunyikannya
- Mengenali masalah query N+1
- Menjelaskan kenapa perubahan skema harus berupa migration
- Mengubah skema yang sudah live tanpa merusak aplikasi yang berjalan
ORM — object-relational mapper — memungkinkanmu menulis db.venue.findMany() alih-alih SQL. Query builder berada di antaranya, lebih dekat ke SQL tapi bisa dikomposisi di JavaScript.
| Pendekatan | Contoh | Pertukarannya |
|---|---|---|
| SQL mentah | node:sqlite, pg | Kontrol penuh, tanggung jawab penuh |
| Query builder | Kysely, Knex | Bertype dan bisa dikomposisi, tetap jelas terlihat SQL |
| ORM | Prisma, Drizzle, TypeORM | Paling cepat ditulis, paling mudah jadi lambat tanpa sengaja |
Masalah N+1
Ini bug performa paling umum yang dibuat mudah oleh ORM, dan ia tak terlihat di kodenya. Kamu mengambil sebuah list, lalu mengulanginya sambil mengambil sesuatu untuk setiap item — satu query untuk list-nya, plus N untuk item-nya.
Halaman yang sama, dua strategi query. Hitung perjalanan bolak-baliknya.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Migration
Migration adalah perubahan skema yang berversi dan berurutan, di-commit ke git. Kamu tidak pernah mengedit database yang live secara manual, karena database rekan-rekanmu dan production akan jadi berbeda dari milikmu tanpa catatan bagaimana.
Sebuah migration runner, dan memang cuma inilah isinya: sebuah nomor versi dan daftar berurutan.
Hasil
Tekan Jalankan untuk melihat hasilnya.
Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.
Itu tepatnya bentuk migrate() di proyek ini, yang melacak versinya di pragma user_version milik SQLite sendiri sehingga tidak butuh tabel tambahan. Bacalah — panjangnya sekitar dua puluh baris.
Mengubah skema live dengan aman
Bagian sulitnya bukan SQL-nya — tapi kenyataan bahwa kode lama dan kode baru berjalan bersamaan selama proses deploy. Penggantian nama yang dilakukan dalam satu langkah akan merusak versi mana pun yang tidak mengharapkannya.
- Tambahkan kolom barunya, boleh null. Kode lama mengabaikannya; kode baru bisa mulai menulisinya.
- Deploy kode yang menulis ke kolom lama dan kolom baru.
- Isi ulang (backfill) kolom baru untuk row yang sudah ada.
- Deploy kode yang membaca kolom barunya.
- Berhenti menulis kolom lama, lalu buang di migration berikutnya.
Tugas praktik
Tambahkan sebuah migration ke proyek ini: entri keempat di MIGRATIONS yang menambahkan kolom display_name yang nullable ke users, plus sebuah index padanya. Restart dev, lalu pastikan dengan PRAGMA user_version bahwa versinya maju ke 2. Lalu coba tambahkan kolom NOT NULL tanpa default dan lihat ia gagal — lalu perbaiki dengan cara yang aman.
Hasil yang diharapkan
user_version jadi 2; percobaan NOT NULL gagal pada row yang sudah ada.