ترحيلات قواعد البيانات في Rust: نظرة عامة على الأدوات والمكتبات
\n\nعند تطوير أي تطبيق، عاجلاً أم آجلاً، تنشأ الحاجة إلى تغيير هيكل قاعدة البيانات. إضافة أعمدة جديدة، إنشاء فهارس أو إعادة تسمية الجداول - كل هذا يتطلب إدارة دقيقة لإصدارات المخطط. في نظام Rust البيئي، توجد عدة حلول ناضجة لتنفيذ الترحيلات. في هذه المقالة، سنستعرض الأساليب والمكتبات الرئيسية المتاحة لمهام إدارة مخطط قاعدة البيانات.
\n\nلماذا نحتاج الترحيلات؟
\nتتيح الترحيلات:
\n- \n
- إدارة إصدارات التغييرات - يمثل كل ترحيل ملفًا منفصلاً برقم إصدار. \n
- أتمتة النشر - تطبيق وتراجع التغييرات أثناء النشر. \n
- العمل الجماعي - مزامنة جميع المطورين للمخطط محليًا. \n
- تجنب الأخطاء - تحمي الترحيلات من التغيير العشوائي للبيانات. \n
الأدوات الرئيسية للترحيلات في Rust
\n\n1. Diesel Migration (مدمج في Diesel ORM)
\nDiesel هو أشهر ORM لـ Rust. يوفر محرك ترحيلات مدمجًا عبر أداة CLI diesel_cli.
الإمكانيات الرئيسية:
\n- \n
- إنشاء ملفات الترحيل مع استعلامات SQL. \n
- دعم PostgreSQL، MySQL، SQLite. \n
- الأوامر:
migration generate،migration run،migration redo. \n - تتبع تلقائي للترحيلات المطبقة. \n
مثال على إنشاء وتطبيق الترحيل:
\n# تثبيت CLI\ncargo install diesel_cli --no-default-features --features postgres\n\n# إنشاء ترحيل جديد\ndiesel migration generate create_users\n\n# في مجلد migrations/ سيظهر ملفا SQL:\n# up.sql - كود التطبيق\n# down.sql - كود التراجع\n\n# تطبيق الترحيل\ndiesel migration run\nمحتوى up.sql:
CREATE TABLE users (\n id SERIAL PRIMARY KEY,\n name VARCHAR(255) NOT NULL,\n email VARCHAR(255) UNIQUE NOT NULL,\n created_at TIMESTAMP DEFAULT NOW()\n);\ndown.sql:
DROP TABLE IF EXISTS users;\n\n2. SQLx migrate (جزء من نظام SQLx البيئي)
\nSQLx هو مشغل غير متزامن لقواعد بيانات SQL. نظام الترحيلات الخاص به يعمل بدون ORM، فقط مع نصوص SQL النقية.
\nالخصائص المميزة:
\n- \n
- دعم PostgreSQL، MySQL، SQLite، MSSQL. \n
- التكامل مع CLI والتشغيل البرمجي من الكود. \n
- إمكانية استخدام كود Rust للتحقق قبل الترحيل. \n
- التحقق التلقائي من التكامل (تجزئة الملفات). \n
مثال على التشغيل البرمجي للترحيلات في Rust:
\nuse sqlx::migrate::Migrator;\nuse sqlx::PgPool;\n\n#[tokio::main]\nasync fn main() -> Result<(), sqlx::Error> {\n let pool = PgPool::connect("postgres://user:pass@localhost/db").await?;\n \n // تحديد المسار إلى مجلد الترحيلات\n let migrator = Migrator::new(std::path::Path::new("./migrations")).await?;\n \n // تشغيل جميع الترحيلات غير المطبقة\n migrator.run(&pool).await?;\n \n println!("تم تنفيذ الترحيلات بنجاح!");\n Ok(())\n}\nهيكل مجلد migrations/:
migrations/\n├── 20231001_initial.sql\n├── 20231002_add_email_index.sql\n└── 20231003_create_roles.sql\nيحتوي كل ملف على SQL عادي، على سبيل المثال:
\n-- 20231001_initial.sql\nCREATE TABLE IF NOT EXISTS users (\n id UUID PRIMARY KEY DEFAULT gen_random_uuid(),\n username TEXT NOT NULL UNIQUE\n);\n\n3. SeaORM Migrator (جزء من SeaORM)
\nSeaORM هو ORM غير متزامن حديث، يقدم نظام الترحيلات الخاص به SeaORM Migrator. يسمح بكتابة الترحيلات بلغة Rust بدلاً من SQL، مما ي