هجرات قواعد البيانات في TypeScript: TypeORM وPrisma وDrizzle

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

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

ابدأ الدورة

هجرات قواعد البيانات في TypeScript: نظرة شاملة على الأدوات ودليل عملي

\n\n

هجرات قواعد البيانات هي طريقة لإدارة الإصدارات وتطبيق التغييرات على مخطط قاعدة البيانات بشكل تسلسلي (إنشاء أو تعديل أو حذف الجداول والفهارس والقيود). في بيئة TypeScript، توجد عدة أدوات قوية لإدارة الهجرات. في هذه المقالة، سنحلل بالتفصيل ثلاثة من أشهر الحلول: TypeORM وPrisma وDrizzle ORM.

\n\n

لماذا نحتاج إلى الهجرات؟

\n

بدون الهجرات، غالبًا ما يقوم المطورون بإجراء التغييرات يدويًا عبر وحدة تحكم SQL أو لوحة الإدارة، مما يؤدي إلى:

\n
    \n
  • فقدان التزامن بين بيئة التطوير وبيئة الإنتاج؛
  • \n
  • أخطاء بسبب العامل البشري؛
  • \n
  • صعوبات عند التراجع عن التغييرات.
  • \n
\n

تحل الهجرات هذه المشكلات من خلال السماح بتطبيق التغييرات وتراجعها تلقائيًا، بالإضافة إلى تخزين تاريخ جميع تغييرات المخطط في الكود.

\n\n

1. TypeORM — النهج التقليدي مع ActiveRecord وData Mapper

\n

TypeORM هو واحد من أكثر ORM نضجًا لـ TypeScript وJavaScript. يدعم كلاً من نمط ActiveRecord وData Mapper، ويحتوي على نظام هجرات مدمج.

\n\n

التثبيت والإعداد

\n
npm install typeorm reflect-metadata @types/node\nnpm install pg  # لقاعدة بيانات PostgreSQL
\n\n

أنشئ ملف التهيئة ormconfig.json أو استخدم data-source.ts:

\n
import { DataSource } from "typeorm";\n\nexport const AppDataSource = new DataSource({\n    type: "postgres",\n    host: "localhost",\n    port: 5432,\n    username: "user",\n    password: "password",\n    database: "mydb",\n    entities: ["src/entity/*.ts"],\n    migrations: ["src/migration/*.ts"],\n    synchronize: false,  // إيقاف المزامنة التلقائية\n});
\n\n

إنشاء وتنفيذ الهجرة

\n

أولاً، سنقوم بتوليد هجرة بناءً على التغييرات في الكيانات:

\n
npx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts
\n\n

مثال على هجرة مولدة:

\n
import { MigrationInterface, QueryRunner, Table } from "typeorm";\n\nexport class AddUserTable1234567890 implements MigrationInterface {\n    public async up(queryRunner: QueryRunner): Promise<void> {\n        await queryRunner.createTable(\n            new Table({\n                name: "user",\n                columns: [\n                    { name: "id", type: "int", isPrimary: true, isGenerated: true, generationStrategy: "increment" },\n                    { name: "name", type: "varchar", length: "255" },\n                    { name: "email", type: "varchar", isUnique: true },\n                ],\n            })\n        );\n    }\n\n    public async down(queryRunner: QueryRunner): Promise<void> {\n        await queryRunner.dropTable("user");\n    }\n}
\n\n

طبق الهجرة:

\n
npx typeorm migration:run -d src/data-source.ts
\n\n

إيجابيات وسلبيات TypeORM

\n
    \n
  • الإيجابيات: بيئة كبيرة، دعم قواعد بيانات متعددة (PostgreSQL, MySQL, SQLite, MSSQL)، توليد الهجرات من الكيانات.
  • \n
  • السلبيات: تهيئة معقدة، سرعة بطيئة مع عدد كبير من الكيانات، قاعدة كود قديمة.
  • \n
\n\n

2. Prisma — ORM حديث مع هجرات تلقائية

\n

Prisma هو المعيار الجديد في ORM لـ TypeScript. يستخدم مخططًا تصريحيًا (schema.prisma) ويولد الهجرات تلقائيًا.

\n\n

التثبيت والتهيئة

\n
npm install prisma @prisma/client\nnpx prisma init
\n\n

حدد النموذج في prisma/schema.prisma:

\n
generator client {\n    provider = "prisma-client-js"\n}\n\ndatasource db {\n    provider = "postgresql"\n    url      = env("DATABASE_URL")\n}\n\nmodel User {\n    id                    

توصيات