ORM لجافا سكريبت (Node.js): مقارنة وأمثلة
في تطوير الويب الحديث باستخدام Node.js، يعد التفاعل مع قواعد البيانات (DB) إحدى المهام الرئيسية. قد يكون استخدام كود SQL الخام فعالاً، لكنه غالباً ما يؤدي إلى التكرار والأخطاء وصعوبات في الصيانة. هنا تأتي ORMs (رسم الخرائط العلائقية للكائنات) للمساعدة - وهي أدوات تتيح لك العمل مع جداول قاعدة البيانات ككائنات جافا سكريبت عادية. في هذه المقالة، سنستعرض ثلاثة من أشهر ORMs لـ Node.js: Sequelize و TypeORM و Prisma، ونقارن ميزاتها ونقدم أمثلة عملية.
ما هو ORM ولماذا هو مطلوب؟
ORM (رسم الخرائط العلائقية للكائنات) هي تقنية تربط قواعد البيانات العلائقية بلغة برمجة كائنية التوجه. بدلاً من كتابة استعلامات SQL، يمكنك التعامل مع الكائنات وطرقها. يوفر هذا عدة مزايا:
- التجريد من قاعدة البيانات: يمكنك التبديل بسهولة بين PostgreSQL و MySQL و SQLite دون تغيير منطق الأعمال.
- الأمان: يقوم ORM تلقائياً بتعقيم البيانات، مما يحمي من حقن SQL.
- الراحة: كود نمطي أقل، ترحيلات تلقائية، التحقق من صحة البيانات.
- دعم العلاقات: تعريف بسيط للعلاقات (واحد لواحد، واحد لكثير، كثير لكثير).
1. Sequelize
Sequelize هو أحد أقدم وأكثر ORMs نضجاً لـ Node.js. يدعم PostgreSQL و MySQL و MariaDB و SQLite و Microsoft SQL Server. يستخدم Sequelize نهجاً كائني التوجه ويعتمد على الـ Promises.
الميزات الرئيسية:
- نظام مرن للترحيلات (migrations) والبذر (seeding) (ملء ببيانات اختبارية).
- دعم المعاملات (transactions)، الاستعلامات الخام (raw queries)، والخطافات (hooks) (دورة حياة النموذج).
- مجتمع كبير والعديد من الحلول الجاهزة.
مثال كود (Node.js):
const { Sequelize, DataTypes } = require('sequelize');
// الاتصال بقاعدة البياناتconst sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'postgres'});
// تعريف النموذجconst User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
// إنشاء سجلasync function createUser() { await sequelize.sync(); // مزامنة النموذج مع قاعدة البيانات const user = await User.create({ name: 'إيفان', email: 'ivan@example.com' }); console.log('تم إنشاء المستخدم:', user.toJSON());}
createUser().catch(console.error);2. TypeORM
TypeORM هو ORM تم إنشاؤه مع التركيز على TypeScript، ولكنه يعمل أيضاً مع جافا سكريبت الخالص. يدعم نفس قواعد البيانات التي يدعمها Sequelize، بالإضافة إلى MongoDB (عبر الوضع التجريبي). يستخدم TypeORM المُزَخرِفات (decorators) (لـ TypeScript) ونهج التسجيل النشط (Active Record) أو مخطط البيانات (Data Mapper).
الميزات الرئيسية:
- دعم كامل لـ TypeScript مع الإكمال التلقائي والتحقق من الأنواع.
- نمطان: Active Record (طرق على النموذج) و Data Mapper (المستودعات).
- ترحيلات تلقائية بناءً على تغييرات الكيانات.
مثال كود (Node.js + TypeScript):
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from "typeorm";
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
// الاستخدامasync function main() { const connection = await createConnection({ type: "postgres", host: "localhost", database: "test", entities: [User], synchronize: true, // إنشاء الجداول تلقائياً (ليس للإنتاج!) });
const user = new User(); user.name = "ماريا"; user.email = "maria@example.com"; await