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
أيضاً في المكتبة
العمل مع الصور في C# (.NET): المكتبات والأدوات والأمثلة
التعامل مع التواريخ في JavaScript (Node.js): المكتبات الشائعة
إرسال SMS بلغة Java: نظرة عامة على مكتبات API (Twilio, Nexmo, بوابات SMS)
توليد PDF في Kotlin: أفضل المكتبات وأمثلة الكود