العمل مع قواعد البيانات في Rust: PostgreSQL و MongoDB

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا Rust وقواعد البيانات مزيج مثالي

Rust هي لغة برمجة أنظمة حديثة تجمع بين أداء C/C++ وأمان الذاكرة الذي يضمنه المترجم. عند تطوير خدمات الخلفية وتطبيقات الويب والخدمات المصغرة، تظهر دائمًا الحاجة للتفاعل مع قواعد البيانات. في هذه المقالة، سنشرح بالتفصيل كيفية العمل مع أشهر نوعين من قواعد البيانات: PostgreSQL العلائقية و MongoDB الموجهة للوثائق.

سنستعرض الاتصال، تنفيذ عمليات CRUD، المعاملات والتجميعات بأمثلة عملية. جميع أمثلة الكود مكتوبة بلغة Rust باستخدام بيئة التشغيل غير المتزامنة tokio، مما يوفر أقصى أداء.



1. إعداد المشروع وتثبيت التبعيات

للبدء، سننشئ مشروعًا جديدًا ونضيف الكريتات اللازمة. افتح الطرفية ونفذ:

cargo new rust_db_examplecd rust_db_example

سنضيف التبعيات في ملف Cargo.toml:

[dependencies]tokio = { version = "1", features = ["full"] }sqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }mongodb = "2.8"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"chrono = { version = "0.4", features = ["serde"] }

الآن هيكل المشروع جاهز. سنستخدم sqlx لقاعدة بيانات PostgreSQL - وهو مشغل غير متزامن يدعم الاستعلامات القابلة للترجمة، والمشغل الرسمي mongodb للعمل مع MongoDB.



1.1. الاتصال بـ PostgreSQL عبر sqlx

سنكتب وحدة للعمل مع PostgreSQL. لننشئ ملف src/postgres.rs:

use sqlx::postgres::PgPoolOptions;use sqlx::PgPool;use anyhow::Result;

pub async fn connect_to_postgres() -> Result<PgPool> { let database_url = "postgres://user:password@localhost:5432/mydb"; let pool = PgPoolOptions::new() .max_connections(5) .connect(database_url) .await?; println!("✅ تم الاتصال بـ PostgreSQL"); Ok(pool)}

// تعريف نموذج المستخدم#[derive(Debug, sqlx::FromRow)]pub struct User { pub id: i32, pub name: String, pub email: String, pub created_at: chrono::NaiveDateTime,}


1.2. الاتصال بـ MongoDB

لننشئ ملف src/mongodb.rs:

use mongodb::{Client, Collection, Database};use mongodb::bson::{doc, Document};use anyhow::Result;

pub async fn connect_to_mongodb() -> Result<(Database, Collection<Document>)> { let client = Client::with_uri_str("mongodb://localhost:27017")?; let database = client.database("mydb"); let collection = database.collection::<Document>("users"); println!("✅ تم الاتصال بـ MongoDB"); Ok((database, collection))}


2. عمليات CRUD في PostgreSQL

الآن سننفذ العمليات الأساسية: إنشاء وقراءة وتحديث وحذف السجلات.



2.1. إدراج البيانات (CREATE)

pub async fn create_user(pool: &PgPool, name: &str, email: &str) -> Result<User> {    let user = sqlx::query_as::<_, User>(        "INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id, name, email, created_at"    )    .bind(name)    .bind(email)    .fetch_one(pool)    .await?;        println!("تم إنشاء المستخدم: {:?}", user);    Ok(user)}


2.2. قراءة البيانات (READ)

pub async fn get_user_by_id(pool: &PgPool, user_id: i32) -> Result<Option<User>> {    let user = sqlx::query_as::<_, User>(        "SELECT id, name, email, created_at FROM users WHERE id = $1"    )    .bind(user_id)    .fetch_optional(pool)    .await?;        match user {        Some(u) => println!("تم العثور على المستخدم: {:?}", u),        None => println!("لم يتم العثور على مستخدم بالمعرف id={}", user_id),    }        Ok(user)}

المدونات

توصيات الكتب