Lompat ke konten
Kembali ke modul

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.

PendekatanContohPertukarannya
SQL mentahnode:sqlite, pgKontrol penuh, tanggung jawab penuh
Query builderKysely, KnexBertype dan bisa dikomposisi, tetap jelas terlihat SQL
ORMPrisma, Drizzle, TypeORMPaling 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.

Coba sendiri

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.

Coba sendiri

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.

  1. Tambahkan kolom barunya, boleh null. Kode lama mengabaikannya; kode baru bisa mulai menulisinya.
  2. Deploy kode yang menulis ke kolom lama dan kolom baru.
  3. Isi ulang (backfill) kolom baru untuk row yang sudah ada.
  4. Deploy kode yang membaca kolom barunya.
  5. 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.