ORM لجافا سكريبت (Node.js): مقارنة Sequelize و TypeORM و Prisma

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

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

ابدأ الدورة

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                    

توصيات