مقدمة: لماذا Rust وقواعد البيانات هما الثنائي المثالي
Rust هي لغة برمجة أنظمة حديثة تكتسب شعبية متزايدة بفضل أدائها العالي، وأمان الذاكرة، وتكلفة الصفر للتجريد. العديد من المطورين القادمين من عالم Python أو JavaScript أو Go يتساءلون: كيفية العمل مع قواعد البيانات في Rust؟ الإجابة بسيطة: توفر Rust برامج تشغيل قوية وآمنة للعمل مع قواعد البيانات العلائقية (PostgreSQL) وقواعد البيانات الموجهة للمستندات (MongoDB).
في هذه المقالة، سنشرح أساسيات العمل مع PostgreSQL و MongoDB في Rust. ستتعلم كيفية إعداد المشروع، والاتصال بقواعد البيانات، وتنفيذ عمليات CRUD الأساسية. المقالة موجهة للمبتدئين، لذا سنستخدم أمثلة بسيطة وواضحة.
1. إعداد المشروع وتثبيت التبعيات
قبل البدء، تأكد من تثبيت Rust و Cargo. قم بإنشاء مشروع جديد:
cargo new rust_db_examplecd rust_db_exampleافتح ملف Cargo.toml وأضف التبعيات اللازمة. للعمل مع PostgreSQL، سنستخدم crate tokio-postgres (برنامج تشغيل غير متزامن) و serde لتسلسل البيانات. أما بالنسبة لـ MongoDB، فسنستخدم برنامج التشغيل الرسمي mongodb.
[dependencies]tokio = { version = "1", features = ["full"] }tokio-postgres = "0.7"serde = { version = "1", features = ["derive"] }serde_json = "1"mongodb = "2.8"لاحظ: نحن نستخدم tokio كبيئة تشغيل غير متزامنة، لأن كلا برنامجي التشغيل يعملان بشكل غير متزامن. هذه ممارسة قياسية لتطبيقات Rust الحديثة.
2. العمل مع PostgreSQL في Rust
PostgreSQL هي قاعدة بيانات علائقية قوية. للعمل معها في Rust، سنستخدم crate tokio-postgres. يوفر واجهة غير متزامنة لتنفيذ استعلامات SQL.
2.1 الاتصال بقاعدة البيانات
لنقم بإنشاء دالة للاتصال بقاعدة بيانات PostgreSQL محلية. تأكد من تشغيل خادم PostgreSQL وإنشاء قاعدة بيانات (مثل test_db):
use tokio_postgres::{NoTls, Error};
#[tokio::main]async fn main() -> Result<(), Error> { // سلسلة الاتصال: postgresql://user:password@localhost/dbname let (client, connection) = tokio_postgres::connect( "host=localhost user=postgres dbname=test_db", NoTls, ).await?;
// تشغيل الاتصال في الخلفية tokio::spawn(async move { if let Err(e) = connection.await { eprintln!("خطأ في الاتصال: {}", e); } });
println!("تم إنشاء الاتصال بـ PostgreSQL!"); Ok(())}2.2 إنشاء جدول وإدراج البيانات
الآن لنقم بإنشاء جدول users وإدراج بعض السجلات:
// إنشاء الجدولclient .execute( "CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(150) UNIQUE NOT NULL )", &[], ) .await?;
// إدراج البياناتlet name = "Alice";let email = "alice@example.com";client .execute( "INSERT INTO users (name, email) VALUES ($1, $2)", &[&name, &email], ) .await?;
println!("تم إضافة المستخدم {}!", name);2.3 قراءة البيانات وتحديثها
لننفذ استعلام SELECT ونقوم بتحديث سجل:
// قراءة البياناتlet rows = client .query("SELECT id, name, email FROM users", &[]) .await?;
for row in rows { let id: i32 = row.get(0); let name: &str = row.get(1); let email: &str = row.get(2); println!("ID: {}, Name: {}, Email: {}", id, name, email);}
// تحديث السجلclient .execute( "UPDATE users SET email = $1 WHERE name = $2", &[&"alice_new