استعلامات متحقَّق منها وقت الترجمة
SQL آمن من حيث النوع
استعلامات متحقَّق منها وقت الترجمة درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
الميزة الأهم
يمكن لـ sqlx التحقق من SQL الخاص بكم في وقت الترجمة مقابل مخطط قاعدة بيانات حقيقي. وتتحول الأخطاء الإملائية وأسماء الأعمدة غير الصحيحة وعدم تطابق الأنواع إلى أخطاء في البناء.
- يستخدم عائلة الماكروهات
query! - يكتشف الأخطاء قبل وقت التشغيل
query! مقابل query
تُفحص الدالة query() في وقت التشغيل. أما ماكرو query! فيُفحص في وقت الترجمة عبر الاتصال بقاعدة البيانات أثناء البناء.
use sqlx::{Pool, Postgres};
async fn run(pool: &Pool<Postgres>) {
let rec = sqlx::query!("SELECT id, name FROM users WHERE id = $1", 1i32)
.fetch_one(pool)
.await
.unwrap();
}حقول النتائج محددة النوع
ينشئ ماكرو query! بنيةً مجهولة تتطابق حقولها مع الأعمدة المحددة، مع استنتاج أنواع Rust الصحيحة من المخطط.
use sqlx::{Pool, Postgres};
async fn name_of(pool: &Pool<Postgres>, id: i32) -> String {
let rec = sqlx::query!("SELECT name FROM users WHERE id = $1", id)
.fetch_one(pool)
.await
.unwrap();
rec.name
}كيفية عمل الفحص
يحتاج sqlx عند البناء إلى DATABASE_URL فعلي أو دليل .sqlx مخزّن مؤقتًا. ويرسل الاستعلام إلى قاعدة البيانات لمعرفة أنواع معلماته ونتائجه.
الوضع غير المتصل باستخدام cargo sqlx prepare
للتكامل المستمر من دون قاعدة بيانات، شغّل cargo sqlx prepare لحفظ البيانات الوصفية للاستعلام في .sqlx/. ثم تستخدم عمليات البناء ذاكرة التخزين المؤقت.
cargo sqlx preparequery_as! داخل بنيتكم
استخدم query_as! لتعيين الصفوف مباشرةً إلى بنية تُعرّفها بنفسك، مع استمرار التحقق الكامل.
use sqlx::{Pool, Postgres};
struct User { id: i32, name: String }
async fn get(pool: &Pool<Postgres>) -> User {
sqlx::query_as!(User, "SELECT id, name FROM users WHERE id = $1", 1i32)
.fetch_one(pool)
.await
.unwrap()
}تصبح الأعمدة القابلة للقيمة NULL من النوع Option
إذا كان العمود قد يحتوي على NULL، فإن sqlx يجعل الحقل من النوع Option. ويمكنكم تجاوز الاستدلال باستخدام تعليقات النوع مثل name as "name!".
use sqlx::{Pool, Postgres};
async fn maybe_email(pool: &Pool<Postgres>) -> Option<String> {
let rec = sqlx::query!("SELECT email FROM users WHERE id = $1", 1i32)
.fetch_one(pool)
.await
.unwrap();
rec.email
}نمذجة استدلال الأنواع
يربط التحقق وقت الترجمة أنواع SQL بأنواع Rust. يوضّح هذا المثال القابل للتشغيل قرار هذا الربط.
fn rust_type(sql: &str, nullable: bool) -> String {
let base = match sql {
"int4" => "i32",
"text" => "String",
"bool" => "bool",
_ => "unknown",
};
if nullable { format!("Option<{}>", base) } else { base.to_string() }
}
fn main() {
println!("{}", rust_type("int4", false));
println!("{}", rust_type("text", true));
}أخطاء الترجمة التي ستظهر لكم
إذا أشرتم إلى عمود غير موجود، يفشل sqlx في بناء المشروع مع رسالة واضحة. وهذه السلامة هي الهدف الأساسي من وحدات الماكرو.
- اسم عمود غير صحيح → خطأ وقت الترجمة
- عدم تطابق الأنواع → خطأ وقت الترجمة
معاملات الربط موضعية
استخدموا العناصر النائبة $1 و$2 مع Postgres. يتحقق sqlx من نوع كل وسيط مرتبط مقابل المخطط.
use sqlx::{Pool, Postgres};
async fn search(pool: &Pool<Postgres>, name: &str, min_age: i32) {
let _ = sqlx::query!(
"SELECT id FROM users WHERE name = $1 AND age >= $2",
name, min_age
).fetch_all(pool).await.unwrap();
}متى تستخدمون الصيغة غير المعتمدة على الماكرو
بالنسبة إلى SQL الديناميكي الذي يُنشأ وقت التشغيل (عندما لا تعرفون الأعمدة مسبقًا)، استخدموا query() / query_as(). وستستبدلون التحقق وقت الترجمة بالمرونة.
use sqlx::{Pool, Postgres};
async fn dynamic(pool: &Pool<Postgres>, sql: &str) {
let _ = sqlx::query(sql).execute(pool).await.unwrap();
}تحقق سريع
اختبروا فهمكم للتحقق وقت الترجمة.
مراجعة
لقد تعلمتم الاستعلامات التي يجري التحقق منها وقت الترجمة:
- يتحقق
query!وquery_as!من SQL مقابل المخطط وقت البناء - يُستدل تلقائيًا على حقول النتائج وأنواعها
- تصبح الأعمدة القابلة للقيمة NULL من النوع
Option - يتيح
cargo sqlx prepareعمليات البناء دون اتصال - استخدموا
query()غير المعتمد على الماكرو مع SQL الديناميكي
التالي: عمليات CRUD.
الأسئلة الشائعة
هل درس «استعلامات متحقَّق منها وقت الترجمة» مجاني؟
نعم — نص درس «استعلامات متحقَّق منها وقت الترجمة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ماذا ستتعلم في «استعلامات متحقَّق منها وقت الترجمة»؟
SQL آمن من حيث النوع تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «استعلامات متحقَّق منها وقت الترجمة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الاتصال بقاعدة بيانات
- استعلامات متحقَّق منها وقت الترجمة
- عمليات CRUD
- الترحيلات