ORM لجافا سكريبت (Node.js): مقارنة وأمثلة
عند تطوير تطبيقات الخادم باستخدام Node.js، يعد التفاعل مع قاعدة البيانات إحدى المهام الرئيسية. يسمح تعيين الكائنات العلائقية (ORM) بالعمل مع قواعد البيانات العلائقية من خلال كائنات جافا سكريبت، مما يلغي الحاجة إلى كتابة SQL خالص. في هذه المقالة، سنناقش ثلاث ORM شائعة: Sequelize و TypeORM و Prisma، ونقارن ميزاتها ونقدم أمثلة عملية.
1. Sequelize
Sequelize هي واحدة من أقدم وأكثر ORM نضجًا لـ Node.js. تدعم PostgreSQL و MySQL و MariaDB و SQLite و MSSQL. تعمل مع Promises و async/await.
التثبيت والإعداد
npm install sequelize sequelize-clinpm install pg pg-hstore # لـ PostgreSQLمثال على النموذج والاستعلامات
const { Sequelize, DataTypes } = require('sequelize');const sequelize = new Sequelize('postgres://user:pass@localhost:5432/mydb');
// تعريف النموذجconst User = sequelize.define('User', { name: { type: DataTypes.STRING, allowNull: false }, email: { type: DataTypes.STRING, unique: true }});
// إنشاء سجلconst user = await User.create({ name: 'إيفان', email: 'ivan@example.com' });
// بحث مع فلترconst users = await User.findAll({ where: { name: 'إيفان' } });
// تحديثawait User.update({ email: 'new@example.com' }, { where: { id: 1 } });الإيجابيات والسلبيات
- + مجتمع كبير، الكثير من الوثائق
- + دعم الترحيل (migrations) والبذور (seeds)
- - بناء جملة ضخم للاستعلامات المعقدة
- - لا يوجد دعم مدمج لـ TypeScript
2. TypeORM
TypeORM هي ORM موجهة نحو TypeScript، ولكنها تعمل أيضًا مع جافا سكريبت العادي. تدعم الديكورات (decorators) و Active Record و Data Mapper. تعمل مع معظم أنظمة إدارة قواعد البيانات الشائعة.
التثبيت والإعداد
npm install typeorm reflect-metadatanpm install pg # لـ PostgreSQLمثال على النموذج مع الديكورات
import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';
@Entity()export class User { @PrimaryGeneratedColumn() id: number;
@Column() name: string;
@Column({ unique: true }) email: string;}
// الاستخدامconst connection = await createConnection();const userRepo = connection.getRepository(User);const user = await userRepo.save({ name: 'آنا', email: 'anna@example.com' });const users = await userRepo.find({ where: { name: 'آنا' } });الإيجابيات والسلبيات
- + دعم ممتاز لـ TypeScript
- + نهجان: Active Record و Data Mapper
- - تكوين معقد للمبتدئين
- - ترحيل بطيء في المشاريع الكبيرة
3. Prisma
Prisma هي ORM حديثة تستخدم لغة مخطط خاصة بها وتنشئ عميلًا آمنًا من حيث النوع. تعتبر الأكثر أداءً وراحة للمطورين.
التثبيت والإعداد
npm install @prisma/clientnpx prisma initتعريف المخطط (schema.prisma)
model User { id Int @id @default(autoincrement()) name String email String @unique}مثال على الاستعلامات
import { PrismaClient } from '@prisma/client';const prisma = new PrismaClient();
// إنشاءconst user = await prisma.user.create({ data: { name: 'أولغا', email: 'olga@example.com' }});
// بحثconst users = await prisma.user.findMany({ where: { name: 'أولغا' } });
// تحديثawait prisma.user.update({ where: { id: 1 }, data: { email: 'new@example.com' }});الإيجابيات والسلبيات
- + أمان كامل من حيث النوع