هجرات قواعد البيانات في TypeScript: نظرة شاملة على الأدوات ودليل عملي
\n\nهجرات قواعد البيانات هي طريقة لإدارة الإصدارات وتطبيق التغييرات على مخطط قاعدة البيانات بشكل تسلسلي (إنشاء أو تعديل أو حذف الجداول والفهارس والقيود). في بيئة TypeScript، توجد عدة أدوات قوية لإدارة الهجرات. في هذه المقالة، سنحلل بالتفصيل ثلاثة من أشهر الحلول: TypeORM وPrisma وDrizzle ORM.
\n\nلماذا نحتاج إلى الهجرات؟
\nبدون الهجرات، غالبًا ما يقوم المطورون بإجراء التغييرات يدويًا عبر وحدة تحكم SQL أو لوحة الإدارة، مما يؤدي إلى:
\n- \n
- فقدان التزامن بين بيئة التطوير وبيئة الإنتاج؛ \n
- أخطاء بسبب العامل البشري؛ \n
- صعوبات عند التراجع عن التغييرات. \n
تحل الهجرات هذه المشكلات من خلال السماح بتطبيق التغييرات وتراجعها تلقائيًا، بالإضافة إلى تخزين تاريخ جميع تغييرات المخطط في الكود.
\n\n1. TypeORM — النهج التقليدي مع ActiveRecord وData Mapper
\nTypeORM هو واحد من أكثر ORM نضجًا لـ TypeScript وJavaScript. يدعم كلاً من نمط ActiveRecord وData Mapper، ويحتوي على نظام هجرات مدمج.
\n\nالتثبيت والإعداد
\nnpm install typeorm reflect-metadata @types/node\nnpm install pg # لقاعدة بيانات PostgreSQL\n\nأنشئ ملف التهيئة ormconfig.json أو استخدم data-source.ts:
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أولاً، سنقوم بتوليد هجرة بناءً على التغييرات في الكيانات:
\nnpx typeorm migration:generate src/migration/AddUserTable -d src/data-source.ts\n\nمثال على هجرة مولدة:
\nimport { 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طبق الهجرة:
\nnpx typeorm migration:run -d src/data-source.ts\n\nإيجابيات وسلبيات TypeORM
\n- \n
- الإيجابيات: بيئة كبيرة، دعم قواعد بيانات متعددة (PostgreSQL, MySQL, SQLite, MSSQL)، توليد الهجرات من الكيانات. \n
- السلبيات: تهيئة معقدة، سرعة بطيئة مع عدد كبير من الكيانات، قاعدة كود قديمة. \n
2. Prisma — ORM حديث مع هجرات تلقائية
\nPrisma هو المعيار الجديد في ORM لـ TypeScript. يستخدم مخططًا تصريحيًا (schema.prisma) ويولد الهجرات تلقائيًا.
التثبيت والتهيئة
\nnpm install prisma @prisma/client\nnpx prisma init\n\nحدد النموذج في prisma/schema.prisma:
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