ORM لجافا سكريبت (Node.js): مقارنة وأمثلة
عند تطوير الجزء الخادم باستخدام Node.js، يظهر عاجلاً أم آجلاً سؤال التفاعل مع قاعدة البيانات. كتابة استعلامات SQL النقية هي مهمة شاقة وعرضة للأخطاء. تأتي ORM (رسم الخرائط العلائقية للكائنات) للمساعدة - وهي مكتبات تسمح بالعمل مع جداول قواعد البيانات ككائنات جافا سكريبت عادية. في هذه المقالة، سنقارن بين ثلاثة من أشهر ORMs لـ Node.js: Sequelize و TypeORM و Prisma، وسنقدم أمثلة توضيحية على الكود.
1. Sequelize
Sequelize هو واحد من أقدم وأكثر ORMs نضجاً لـ Node.js. يدعم PostgreSQL و MySQL و MariaDB و SQLite و Microsoft SQL Server. يستخدم Sequelize النهج الكلاسيكي مع النماذج والوعود (أو async/await).
التثبيت
npm install sequelize pg pg-hstoreمثال: تعريف النموذج والاستعلام
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('database', 'user', '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();ميزات Sequelize
- النضج والمجتمع الكبير.
- دعم المعاملات (transactions) والترحيلات (migrations) وبيانات التهيئة (seeds).
- نظام ارتباطات مرن (hasOne, hasMany, belongsToMany).
- العيب: بناء جملة ضخم في بعض الأماكن وتصحيح أخطاء معقد.
2. TypeORM
TypeORM هو ORM يمكنه العمل مع كل من جافا سكريبت و TypeScript. يدعم نفس أنظمة إدارة قواعد البيانات مثل Sequelize، ويقدم نهجين: Active Record و Data Mapper. يستخدم TypeORM أيضاً المُزَخرِفات (decorators) بشكل نشط، مما يجعل الكود أكثر تصريحاً.
التثبيت
npm install typeorm reflect-metadata pgمثال: نموذج مع مُزَخرِف واستعلام
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
async function createUser() { 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 connection.manager.save(user); console.log(user);}createUser();ميزات TypeORM
- تكامل ممتاز مع TypeScript والمُزَخرِفات.
- المرونة: الاختيار بين Active Record و Data Mapper.
- دعم الترحيلات (migrations) ومشتركي الأحداث والتسجيل (logging).
- العيب: التوثيق غير مكتمل في بعض الأماكن، وتغييرات جذرية متكررة (breaking changes).
3. Prisma
Prisma هو ORM حديث يختلف جوهرياً عن سابقيه. بدلاً من النماذج في الكود، تصف مخطط البيانات في ملف خاص schema.prisma، ويقوم Prisma بتوليد عميل آمن من حيث النوع (type-safe). وهذا يضمن الإكمال التلقائي في بيئة التطوير المتكاملة (IDE) والحد الأدنى من الأخطاء.
التثبيت
npm install @prisma/clientnpx prisma initمثال: المخطط والاستعلام
schema.prisma:
datasource db { provider = "postgresql" url = env("DATABASE_URL")}
model User { id Int @id @default(autoincrement()) name String email String @unique}كود جافا سكريبت:
const { PrismaClie