إنشاء الاستعلامات الآمن نوعيًا
ابنوا استعلامات ترفض الأعمدة غير الصالحة أثناء التجميع
إنشاء الاستعلامات الآمن نوعيًا درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
استعلامات لا يمكنها الإشارة إلى أعمدة غير معروفة
يرفض منشئ الاستعلام الآمن من ناحية الأنواع أسماء الأعمدة غير الموجودة في الجدول في وقت الترجمة. وتشيرون إلى الأعمدة من خلال كائنات ذات أنواع، لا من خلال سلاسل نصية خام.
مراجع الأعمدة ذات الأنواع
بعد تعريف الجدول، يصبح كل عمود خاصية في كائن الجدول. وتمررون هذه الخصائص، لا السلاسل النصية، إلى عوامل التصفية وعمليات الاختيار.
import { eq } from "drizzle-orm";
// users.id and users.name are typed column objects
const rows = await db
.select()
.from(users)
.where(eq(users.id, 1));العمود غير المعروف = خطأ في وقت الترجمة
بما أن الأعمدة خصائص حقيقية، يُكتشف الخطأ المطبعي فورًا. ولا توجد وسيلة إفلات تعتمد على السلاسل النصية دون أنواع.
await db.select().from(users).where(eq(users.idd, 1));
// ^^^^
// Error: Property "idd" does not exist on the users table.المعاملات ذات الأنواع في المقارنات
تكون العوامل مثل eq عامة بالنسبة إلى نوع العمود. وتؤدي مقارنة عمود رقمي بسلسلة نصية إلى خطأ في النوع.
eq(users.age, 30); // ok: age is number
eq(users.age, "thirty"); // Error: string is not assignable to numberاختيار أعمدة محددة
مرروا كائنًا تكون قيمه مراجع أعمدة لاختيار مجموعة فرعية. وتصبح المفاتيح التي تختارونها مفاتيح النتائج.
const partial = await db
.select({ id: users.id, name: users.name })
.from(users);
// result rows: { id: number; name: string }[]رفض الأعمدة من الجداول الأخرى
تقتصر خريطة الاختيار على أعمدة الجدول أو الجداول التي يجري الاستعلام منها. وتؤدي الإشارة إلى عمود من جدول غير ذي صلة إلى فشل الترجمة.
await db
.select({ title: posts.title }) // posts not in this query
.from(users);
// Error: posts.title is not part of the FROM clause.الشروط القابلة للتركيب
تتحد الشروط باستخدام and وor وnot. ويظل لكل جزء نوعه، لذلك يُكتشف الشرط غير الصحيح حتى في عمق شجرة الشروط.
import { and, gt, eq } from "drizzle-orm";
const q = db.select().from(users).where(
and(gt(users.age, 18), eq(users.isAdmin, false))
);الترتيب والتحديد
يأخذ orderBy أيضًا مراجع أعمدة ذات أنواع، ولذلك لا يمكنكم الترتيب حسب عمود غير موجود في الجدول.
import { desc } from "drizzle-orm";
await db.select().from(users).orderBy(desc(users.age)).limit(10);كيفية عمل الرفض
يكون المنشئ عامًا بالنسبة إلى نوع الجدول. ولا تقبل توقيعاتا where وselect إلا قيمًا من النوع Column<TTable>، ولذلك يرفض المترجم أي شيء آخر بنيويًا.
// Conceptual signature
declare function select<T>(
table: T,
cols: { [k: string]: ColumnOf<T> }
): Query;عمليات الإدراج ذات أنواع أيضًا
تُتحقق قيم الإدراج مقابل نموذج الإدراج. وتصبح الحقول المطلوبة المفقودة أو أنواع القيم الخاطئة أخطاءً في وقت الترجمة قبل تنفيذ أي SQL.
await db.insert(users).values({
name: "Ada",
isAdmin: false,
// missing fields would error; extra unknown keys error too
});لماذا يساعد هذا
تنشأ معظم أخطاء ORM من عمود أُعيدت تسميته أو كُتب نوعه خطأ، ولا يُكتشف ذلك إلا في وقت التشغيل. ويحوّل المنشئ الآمن من ناحية الأنواع هذه الأخطاء إلى خطوط حمراء متموجة في المحرر، قبل وقت طويل من النشر.
تحقق سريع
تحققوا من استيعابكم لبناء الاستعلامات الآمنة من ناحية الأنواع.
مراجعة
يستخدم بناء الاستعلامات الآمن من ناحية الأنواع مراجع أعمدة ذات أنواع بدلًا من السلاسل النصية. وتصبح الأعمدة غير المعروفة، وأنواع المعاملات الخاطئة، والأعمدة القادمة من جداول غير موجودة في عبارة FROM أخطاءً في وقت الترجمة. ويكون المنشئ عامًا بالنسبة إلى الجدول، ولذلك يفرض نظام الأنواع صحة البنية.
الأسئلة الشائعة
هل درس «إنشاء الاستعلامات الآمن نوعيًا» مجاني؟
نعم — نص درس «إنشاء الاستعلامات الآمن نوعيًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.
ماذا ستتعلم في «إنشاء الاستعلامات الآمن نوعيًا»؟
ابنوا استعلامات ترفض الأعمدة غير الصالحة أثناء التجميع تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟
لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «إنشاء الاستعلامات الآمن نوعيًا»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟
نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعيين المخطط إلى النوع
- إنشاء الاستعلامات الآمن نوعيًا
- استنتاج أشكال نتائج الاستعلام
- العلاقات وعمليات الربط مع الأنواع