Menjalankan Kueri
Baca baris menjadi case class.
Menjalankan Kueri adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 2 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.
Interpolator sql
Interpolator string sql milik Doobie adalah inti pembuatan kueri. Interpolator ini mengurai SQL Anda dan mengubah nilai Scala yang disisipkan menjadi parameter terikat yang aman.
Nilai yang diinterpolasikan menjadi placeholder JDBC ?, sehingga tidak ada injeksi SQL dan tidak diperlukan pemasangan PreparedStatement secara manual.
import doobie.implicits._
val minAge = 18
val frag = sql"select name from users where age >= $minAge"Dari Fragment ke Kueri
Ekspresi sql"..." adalah sebuah Fragment. Untuk menjalankannya sebagai pembacaan, Anda memanggil .query[A] dengan memilih jenis baris A.
Doobie menggunakan typeclass Read[A] untuk memetakan kolom hasil ke A, termasuk tipe primitif, tuple, dan kelas kasus.
case class User(name: String, age: Int)
val q: Query0[User] =
sql"select name, age from users".query[User]unique, option, dan to
Sebuah Query0[A] menyediakan beberapa akumulator. .unique mengharapkan tepat satu baris, .option mengharapkan nol atau satu baris, sedangkan .to[List] mengumpulkan semua baris.
Masing-masing mengembalikan ConnectionIO yang nantinya Anda jalankan dengan .transact.
val one: ConnectionIO[User] = q.unique
val maybe: ConnectionIO[Option[User]] = q.option
val all: ConnectionIO[List[User]] = q.to[List]Memetakan Baris ke Kelas Kasus
Doobie secara otomatis menghasilkan instans Read untuk kelas kasus jika setiap bidang memiliki pemetaan kolom. Urutan kolom harus sesuai dengan daftar select.
Dengan begitu, Anda dapat langsung memilih data ke dalam tipe domain yang kaya tanpa kode penguraian baris yang berulang.
case class Account(id: Long, email: String, active: Boolean)
val accounts =
sql"select id, email, active from accounts"
.query[Account].to[Vector]Kueri Berparameter
Setiap nilai Scala yang diinterpolasikan diikat sebagai parameter menggunakan instans Put-nya. Anda dapat menginterpolasikan sebanyak yang diperlukan, termasuk pada posisi yang berbeda.
Karena nilai tersebut diikat, bukan digabungkan, tipenya diperiksa dan injeksi tidak mungkin terjadi.
def findByEmail(email: String): ConnectionIO[Option[Account]] =
sql"select id, email, active from accounts where email = $email"
.query[Account].optionMengalirkan Hasil Berukuran Besar
Untuk kumpulan hasil yang besar, gunakan .stream untuk memperoleh fs2 Stream[ConnectionIO, A]. Baris diambil secara malas menggunakan kursor sisi server, sehingga penggunaan memori tetap terbatas.
Gabungkan dengan kombinator fs2 untuk memproses jutaan baris secara bertahap.
import fs2.Stream
val s: Stream[ConnectionIO, Account] =
sql"select id, email, active from accounts"
.query[Account].streamMengontrol Ukuran Pengambilan
Ukuran pengambilan kursor bawaan mungkin memuat semuanya sekaligus pada beberapa pengandar. .streamWithChunkSize(n) menetapkan ukuran pengambilan JDBC agar kursor mengambil n baris pada setiap perjalanan pulang-pergi.
Penyesuaian ini menyeimbangkan jumlah perjalanan pulang-pergi dengan penggunaan memori.
val s =
sql"select id, email, active from accounts"
.query[Account]
.streamWithChunkSize(512)Kolom Opsional dan Ketenilan
Kolom yang dapat bernilai null dipetakan ke Option[A] dalam tipe baris Anda. Jika sebuah kolom dapat bernilai NULL, Anda harus membacanya sebagai Option; jika tidak, Doobie akan menimbulkan kesalahan saat menemukan nilai null.
Dengan demikian, kemungkinan null dinyatakan secara eksplisit dan aman secara tipe pada batas sistem.
case class Person(id: Long, nickname: Option[String])
val ps =
sql"select id, nickname from people".query[Person].to[List]Membangun SQL dengan Fragments
Nilai Fragment dapat digabungkan dengan ++, sehingga Anda dapat menyusun kueri dari beberapa bagian sambil tetap mengikat parameter.
Penginterpolasi fr membangun fragmen dengan spasi di akhir, yang berguna untuk menyambungkan klausa.
val base = fr"select id, email, active from accounts"
val where = fr"where active = $${true}"
val q = (base ++ where).query[Account]Klausa WHERE Dinamis
Pembantu Fragments milik Doobie membangun klausa bersyarat. Fragments.whereAndOpt menggabungkan filter opsional dan hanya menghasilkan filter yang tersedia.
Inilah cara idiomatis untuk membangun kueri pencarian dinamis yang aman.
import doobie.util.fragments._
val emailOpt: Option[String] = Some("a@b.com")
val filter = whereAndOpt(emailOpt.map(e => fr"email = $e"))
val q = (fr"select id, email, active from accounts" ++ filter)Memeriksa Kueri Saat Pembangunan
Analisis check milik Doobie menjalankan kueri terhadap skema basis data untuk memverifikasi bahwa tipe dan jumlah kolom sesuai dengan tipe Scala Anda.
Saat digunakan dalam pengujian, analisis ini mendeteksi perubahan skema sebelum mencapai lingkungan produksi.
import doobie.scalatest._
// inside a spec mixing in IOChecker
check(sql"select id, email, active from accounts".query[Account])Pemeriksaan Cepat
Pilih akumulator yang tepat.
Ringkasan
Penginterpolasi sql membangun Fragment berparameter; .query[A] mengubahnya menjadi Query0[A] yang dipetakan melalui Read[A].
Pilih .unique, .option, .to[List], atau .stream untuk mengakumulasikan baris. Gunakan Fragments untuk klausa dinamis dan check untuk memvalidasi terhadap skema.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Menjalankan Kueri” gratis?
Ya — teks lengkap “Menjalankan Kueri” 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 “Menjalankan Kueri”?
Baca baris menjadi case class. 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 2 dari 4.
Berapa lama pelajaran “Menjalankan Kueri” 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.