ORM لـ TypeScript: مقارنة بين TypeORM و Prisma و MikroORM

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

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

ابدأ الدورة

ORM لـ TypeScript: مقارنة وأمثلة



في تطوير الويب الحديث باستخدام TypeScript، يعد اختيار ORM (Object-Relational Mapping) المناسب أحد القرارات الرئيسية التي تؤثر على بنية المشروع وأدائه وسهولة صيانته. يسمح ORM بالعمل مع قاعدة البيانات من خلال كائنات لغة البرمجة، مما يلخص استعلامات SQL. في هذه المقالة، سنستعرض ثلاثة من أشهر ORMs لـ TypeScript: TypeORM و Prisma و MikroORM. ستتعرف على نقاط القوة والضعف لكل منها، بالإضافة إلى رؤية أمثلة على الكود لكل منها.



1. TypeORM



TypeORM هي واحدة من أقدم وأكثر ORMs نضجًا لـ TypeScript و JavaScript. وهي تدعم أنماط Active Record و Data Mapper، بالإضافة إلى العديد من قواعد البيانات: PostgreSQL و MySQL و SQLite و MongoDB وغيرها.



ميزات TypeORM:

  • دعم الديكورات (Decorators) لتعريف الكيانات
  • علاقات مرنة: OneToOne و OneToMany و ManyToMany
  • الترحيلات (Migrations) ومزامنة المخطط (Schema)
  • دعم الاشتراكات وأحداث دورة الحياة
  • منشئ الاستعلامات (Query Builder) للاستعلامات المعقدة


مثال على الكود باستخدام TypeORM:

import { Entity, PrimaryGeneratedColumn, Column, BaseEntity, createConnection } from "typeorm";

@Entity()export class User extends BaseEntity { @PrimaryGeneratedColumn() id: number;

@Column() name: string;

@Column() email: string;}

async function main() { await createConnection({ type: "postgres", host: "localhost", port: 5432, username: "test", password: "test", database: "test", entities: [User], synchronize: true, });

const user = new User(); user.name = "إيفان"; user.email = "ivan@example.com"; await user.save();

const users = await User.find(); console.log(users);}


الإيجابيات: مجتمع كبير، العديد من الدروس التعليمية، دعم MongoDB. السلبيات: تكوين معقد، مشاكل في التحميل البطيء (lazy loading)، وأحيانًا API غير بديهي.



2. Prisma



Prisma هي ORM حديثة تعيد تصور طريقة العمل مع قاعدة البيانات. بدلاً من ORM التقليدي، تقدم ثلاثة مكونات: Prisma Client (عميل آمن من حيث النوع يتم إنشاؤه تلقائيًا)، Prisma Migrate (نظام ترحيل)، و Prisma Studio (واجهة رسومية).



ميزات Prisma:

  • مخطط بيانات تصريحي (schema.prisma)
  • تحديد كامل للأنواع بناءً على المخطط - لا حاجة لأنواع يدوية
  • توليد تلقائي للعميل
  • دعم المعاملات (Transactions) والترقيم (Paginations)
  • التكامل مع GraphQL (Nexus, TypeGraphQL)


مثال على الكود باستخدام Prisma:

// schema.prismamodel User {  id    Int     @id @default(autoincrement())  name  String  email String  @unique  posts Post[]}

model Post { id Int @id @default(autoincrement()) title String content String? authorId Int author User @relation(fields: [authorId], references: [id])}

// main.tsimport { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function main() { const user = await prisma.user.create({ data: { name: 'ماريا', email: 'maria@example.com', posts: { create: { title: 'أول منشور لي' } } }, include: { posts: true } });

const users = await prisma.user.findMany({ include: { posts: true } }); console.log(users);}

main() .catch(e => console.error(e)) .finally(() => prisma.$disconnect());


الإيجابيات: أفضل تحديد للأنواع في فئتها، بناء جملة بسيط، توثيق ممتاز. السلبيات: الارتباط بالمخطط، صعوبة في الاستعلامات المخصصة، استهلاك أكبر للذاكرة.



3. MikroORM



MikroORM هي ORM صغيرة الحجم، مستوحاة من Doctrine

توصيات