0Pricing
Scala for Backend Engineering & Functional Programming · Pelajaran

Penyisipan dan Pembaruan

Tulis data secara fungsional.

Penyisipan dan Pembaruan adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Update0 untuk Operasi Tulis

Operasi tulis menggunakan penginterpolasi sql yang sama, tetapi Anda memanggil .update untuk memperoleh Update0, bukan .query.

Menjalankan .run pada Update0 mengembalikan ConnectionIO[Int]: jumlah baris yang terpengaruh.

import doobie.implicits._

def insert(name: String, age: Int): ConnectionIO[Int] =
  sql"insert into users (name, age) values ($name, $age)".update.run

Jumlah Baris yang Terpengaruh

Int dari .run adalah jumlah pembaruan JDBC. Untuk UPDATE atau DELETE, nilai ini menunjukkan jumlah baris yang cocok.

Anda dapat menggunakan nilai ini untuk menentukan tindakan, misalnya mendeteksi pembaruan yang tidak cocok dengan baris mana pun.

def deactivate(id: Long): ConnectionIO[Int] =
  sql"update users set active = false where id = $id".update.run

Mengembalikan Kunci yang Dihasilkan

Untuk memperoleh kunci utama yang dibuat otomatis, gunakan .withUniqueGeneratedKeys dan sebutkan kolom yang dikembalikan oleh basis data.

Operasi ini menjalankan penyisipan dan membaca kembali nilai yang dihasilkan dalam satu perjalanan pulang-pergi.

def insertReturningId(name: String, age: Int): ConnectionIO[Long] =
  sql"insert into users (name, age) values ($name, $age)"
    .update
    .withUniqueGeneratedKeys[Long]("id")

Mengembalikan Seluruh Baris

Anda dapat mengembalikan beberapa kolom yang dihasilkan atau diberi nilai bawaan sekaligus dengan membacanya ke dalam tuple atau kelas kasus.

Ini sangat berguna untuk mengambil nilai bawaan sisi server seperti stempel waktu segera setelah penyisipan.

case class User(id: Long, name: String, createdAt: java.time.Instant)

def create(name: String): ConnectionIO[User] =
  sql"insert into users (name) values ($name)"
    .update
    .withUniqueGeneratedKeys[User]("id", "name", "created_at")

Kelas Update untuk Pemrosesan Kumpulan

Update[A] adalah pernyataan berparameter yang telah disiapkan dan dapat Anda jalankan berkali-kali. Anda mendefinisikan SQL sekali dengan penampung ?, lalu memberikan nilai bertipe A.

Objek ini dibangun dari string SQL dan instans Write[A].

val ins: Update[(String, Int)] =
  Update[(String, Int)]("insert into users (name, age) values (?, ?)")

Penyisipan Kumpulan yang Efisien

updateMany mengirimkan seluruh koleksi dalam satu kumpulan JDBC, jauh lebih cepat daripada mengulang penyisipan satu per satu.

Operasi ini mengembalikan jumlah total baris yang terpengaruh. Gunakan ini saat memuat banyak baris sekaligus.

val rows = List(("Ada", 36), ("Linus", 54))

val batch: ConnectionIO[Int] = ins.updateMany(rows)

Penyisipan Kumpulan dengan Kunci

Update juga dapat mengalirkan kunci yang dihasilkan untuk sebuah kumpulan melalui updateManyWithGeneratedKeys, dengan mengembalikan satu baris untuk setiap catatan yang disisipkan.

Ini menggabungkan pemuatan massal dengan pembacaan kembali pengenal yang diberikan.

import fs2.Stream

val keyed: Stream[ConnectionIO, Long] =
  ins.updateManyWithGeneratedKeys[Long]("id")(rows)

Upsert dengan ON CONFLICT

Upsert khusus basis data dapat digunakan dengan baik melalui Doobie. Pada PostgreSQL, Anda menulis insert ... on conflict ... do update sebagai SQL biasa.

Doobie hanya mengikat parameter Anda; semantik upsert menjadi tanggung jawab basis data.

def upsert(email: String, name: String): ConnectionIO[Int] =
  sql"""insert into accounts (email, name) values ($email, $name)
         on conflict (email) do update set name = excluded.name"""
    .update.run

Instans Write dan Nilai Bawaan

Parameter dikodekan dengan typeclass Write[A], yang diturunkan untuk tipe primitif, tuple, dan kelas kasus. Setiap bidang memerlukan instans Put.

Jika Anda tidak menyertakan sebuah kolom dalam penyisipan, basis data menerapkan DEFAULT-nya; inilah cara stempel waktu yang dihasilkan muncul.

case class NewUser(name: String, age: Int)

val mk = Update[NewUser](
  "insert into users (name, age) values (?, ?)"
)

Pemetaan Kolom Khusus dengan Meta

Untuk menyimpan tipe khusus, definisikan Meta[A] dengan memetakannya ke tipe kolom yang sudah ada menggunakan imap (atau timap).

Sebuah Meta menyediakan operasi membaca dan menulis, sehingga tipe tersebut berfungsi baik dalam kueri maupun pembaruan.

import doobie.util.meta.Meta

case class UserId(value: Long)

implicit val uidMeta: Meta[UserId] =
  Meta[Long].imap(UserId.apply)(_.value)

Penghapusan Juga Merupakan Pembaruan

Pernyataan DELETE juga menggunakan .update.run dan mengembalikan jumlah baris yang dihapus.

Memperlakukan penyisipan, pembaruan, dan penghapusan secara seragam sebagai Update0 membuat API tetap kecil dan mudah dikomposisikan.

def purgeInactive: ConnectionIO[Int] =
  sql"delete from users where active = false".update.run

Pemeriksaan Cepat

Pilih pendekatan yang paling efisien.

Ringkasan

Operasi tulis menggunakan .update untuk menghasilkan Update0; .run mengembalikan baris yang terpengaruh, sedangkan .withUniqueGeneratedKeys membaca kembali nilai yang dihasilkan.

Untuk pekerjaan massal, Update[A].updateMany melakukan pengelompokan secara efisien. Tipe khusus memperoleh instans Meta, dan upsert hanyalah SQL basis data biasa yang parameternya diikat oleh Doobie.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penyisipan dan Pembaruan” gratis?

Ya — teks lengkap “Penyisipan dan Pembaruan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Penyisipan dan Pembaruan”?

Tulis data secara fungsional. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?

Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Penyisipan dan Pembaruan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?

Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Menghubungkan dengan Transactor
  2. Menjalankan Kueri
  3. Penyisipan dan Pembaruan
  4. Menyusun Transaksi
← Kembali ke Scala for Backend Engineering & Functional Programming