تشغيل الاستعلامات
اقرأ الصفوف في case classes
تشغيل الاستعلامات درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
مُدرِج sql
يُعد مُدرِج السلاسل النصية sql في Doobie جوهر الاستعلام. فهو يحلل SQL ويحوّل قيم Scala المضمّنة إلى معاملات آمنة مرتبطة.
وتصبح القيم المُدرجة عناصر نائبة ? في JDBC، لذلك لا يوجد حقن SQL ولا حاجة إلى إعداد PreparedStatement يدويًا.
import doobie.implicits._
val minAge = 18
val frag = sql"select name from users where age >= $minAge"من Fragment إلى Query
تعبير sql"..." هو كائن Fragment. ولتنفيذه كاستعلام قراءة، تستدعي .query[A] مع اختيار نوع الصف A.
يستخدم Doobie فئة الأنواع Read[A] لربط أعمدة النتائج بالنوع A، مع دعم الأنواع البدائية، والـ tuples، وcase classes.
case class User(name: String, age: Int)
val q: Query0[User] =
sql"select name, age from users".query[User]unique و option و to
يوفّر Query0[A] مجمّعات مختلفة. يتوقع .unique صفًا واحدًا بالضبط، ويتوقع .option صفرًا أو صفًا واحدًا، بينما يجمع .to[List] جميع الصفوف.
يعيد كل منها قيمة ConnectionIO تنفذها لاحقًا باستخدام .transact.
val one: ConnectionIO[User] = q.unique
val maybe: ConnectionIO[Option[User]] = q.option
val all: ConnectionIO[List[User]] = q.to[List]ربط الصفوف بـ Case Classes
يشتق Doobie مثيلات Read للـ case classes تلقائيًا عندما يكون لكل حقل ربط بعمود. يجب أن يطابق ترتيب الأعمدة ترتيب قائمة select.
يتيح لك ذلك إجراء select مباشرةً إلى أنواع مجال غنية من دون كتابة تعليمات برمجية مكررة لتحليل الصفوف.
case class Account(id: Long, email: String, active: Boolean)
val accounts =
sql"select id, email, active from accounts"
.query[Account].to[Vector]الاستعلامات ذات المعاملات
تُمرَّر كل قيمة Scala داخل interpolation كمعامل باستخدام مثيل Put الخاص بها. ويمكنك تمرير العدد الذي تريده من القيم، بما في ذلك وضعها في مواضع مختلفة.
ولأنها تُربط ولا تُلصق بالنص، تُفحَص الأنواع ويصبح حقن SQL مستحيلًا.
def findByEmail(email: String): ConnectionIO[Option[Account]] =
sql"select id, email, active from accounts where email = $email"
.query[Account].optionتدفق النتائج الكبيرة
بالنسبة إلى مجموعات النتائج الكبيرة، استخدم .stream للحصول على Stream[ConnectionIO, A] من fs2. تُجلَب الصفوف بشكل كسول باستخدام مؤشر من جهة الخادم، مما يحافظ على استهلاك الذاكرة ضمن حدود ثابتة.
ادمجه مع combinators الخاصة بـ fs2 لمعالجة ملايين الصفوف تدريجيًا.
import fs2.Stream
val s: Stream[ConnectionIO, Account] =
sql"select id, email, active from accounts"
.query[Account].streamالتحكم في حجم الجلب
قد يؤدي حجم جلب المؤشر الافتراضي إلى تحميل كل شيء دفعة واحدة مع بعض برامج التشغيل. يضبط .streamWithChunkSize(n) حجم جلب JDBC، بحيث يجلب المؤشر n من الصفوف في كل رحلة ذهاب وإياب.
توازن هذه الضبطية بين عدد الرحلات واستهلاك الذاكرة.
val s =
sql"select id, email, active from accounts"
.query[Account]
.streamWithChunkSize(512)الأعمدة الاختيارية وقابلية عدم الإسناد
تُربط الأعمدة التي تقبل القيمة NULL بـ Option[A] في نوع الصف. إذا كان العمود يمكن أن تكون قيمته NULL، فيجب قراءته كـ Option، وإلا يرمي Doobie استثناءً عند مواجهة قيمة null.
يجعل ذلك قابلية عدم الإسناد صريحة وآمنة من ناحية الأنواع عند الحد الفاصل.
case class Person(id: Long, nickname: Option[String])
val ps =
sql"select id, nickname from people".query[Person].to[List]إنشاء SQL باستخدام Fragments
تتراكب قيم Fragment باستخدام ++، مما يتيح لك تجميع الاستعلامات من أجزاء مع إبقاء المعاملات مربوطة.
ينشئ interpolator fr جزءًا مع مسافة في نهايته، وهو أمر مفيد لوصل العبارات ببعضها.
val base = fr"select id, email, active from accounts"
val where = fr"where active = $${true}"
val q = (base ++ where).query[Account]عبارات WHERE الديناميكية
تُنشئ مساعدات Fragments في Doobie عبارات شرطية. وتجمع Fragments.whereAndOpt المرشحات الاختيارية، ولا تُصدر إلا المرشحات الموجودة.
هذه هي الطريقة الاصطلاحية لإنشاء استعلامات بحث ديناميكية وآمنة.
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)فحص الاستعلامات وقت البناء
يشغّل تحليل check في Doobie استعلامًا مقابل مخطط قاعدة البيانات للتحقق من تطابق أنواع الأعمدة وعددها مع أنواع Scala الخاصة بك.
وعند استخدامه في الاختبارات، يكشف تغيّر المخطط قبل وصوله إلى بيئة الإنتاج.
import doobie.scalatest._
// inside a spec mixing in IOChecker
check(sql"select id, email, active from accounts".query[Account])تحقق سريع
اختر المجمّع المناسب.
مراجعة
ينشئ interpolator sql عناصر Fragment ذات معاملات، ويحوّلها .query[A] إلى Query0[A] يُربط عبر Read[A].
اختر .unique أو .option أو .to[List] أو .stream لتجميع الصفوف. استخدم Fragments للعبارات الديناميكية وcheck للتحقق من المخطط.
الأسئلة الشائعة
هل درس «تشغيل الاستعلامات» مجاني؟
نعم — نص درس «تشغيل الاستعلامات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «تشغيل الاستعلامات»؟
اقرأ الصفوف في case classes تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تشغيل الاستعلامات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاتصال باستخدام Transactor
- تشغيل الاستعلامات
- عمليات الإدراج والتحديث
- تركيب المعاملات