ما هو TypeORM ولماذا هو مطلوب؟
\n\nTypeORM هي مكتبة قوية للربط بين الكائنات وقواعد البيانات العلائقية (ORM) لـ TypeScript و JavaScript، تعمل مع قواعد بيانات مختلفة: PostgreSQL، MySQL، MariaDB، SQLite، MS SQL Server، Oracle و MongoDB (جزئيًا). توفر طريقة ملائمة للتفاعل مع قواعد البيانات العلائقية من خلال نهج موجه للكائنات، مما يسمح للمطورين بالعمل مع الجداول كفئات، ومع السجلات ككائنات.
\n\nالأسباب الرئيسية لاستخدام TypeORM:
\n- \n
- الكتابة (Typing): تكامل كامل مع TypeScript يوفر كتابة صارمة وإكمال تلقائي في بيئة التطوير المتكاملة (IDE). \n
- النهج التصريحي: تعريف مخطط قاعدة البيانات من خلال الديكورات (Decorators) أو المخططات. \n
- الترحيل التلقائي (Auto-migrations): إنشاء ومزامنة تلقائية لمخطط قاعدة البيانات. \n
- السجل النشط (Active Record) و Data Mapper: دعم كلا النمطين الشائعين. \n
- دعم العلاقات: واحد إلى واحد، واحد إلى متعدد، متعدد إلى متعدد. \n
- منشئ الاستعلامات (Query Builder): منشئ استعلامات مرن للاستعلامات SQL المعقدة. \n
- التوافق عبر المنصات: يعمل مع Node.js، المتصفحات، React Native و Ionic. \n
تثبيت TypeORM
\n\nلتثبيت TypeORM وبرامج تشغيل قاعدة البيانات المطلوبة، استخدم npm (أو yarn):
\n\n// تثبيت TypeORM\nnpm install typeorm --save\n\n// تثبيت reflect-metadata (إلزامي للديكورات)\nnpm install reflect-metadata --save\n\n// تثبيت برنامج تشغيل PostgreSQL\nnpm install pg --save\n\n// تثبيت برنامج تشغيل MySQL/MariaDB\nnpm install mysql2 --save\n\n// تثبيت برنامج تشغيل SQLite\nnpm install sqlite3 --save\n\n// تثبيت برنامج تشغيل SQL Server\nnpm install mssql --save\n\n// تثبيت برنامج تشغيل MongoDB (تجريبي)\nnpm install mongodb --save\n\nبعد التثبيت، أضف إلى tsconfig.json:
{\n "compilerOptions": {\n "emitDecoratorMetadata": true,\n "experimentalDecorators": true\n }\n}\n\nبداية سريعة مع مثال كود
\n\nلنقم بإنشاء تطبيق بسيط لإدارة المستخدمين باستخدام SQLite (لا يتطلب تثبيت خادم).
\n\n1. أنشئ ملف data-source.ts لتكوين الاتصال:
import { DataSource } from "typeorm";\nimport { User } from "./entity/User";\n\nexport const AppDataSource = new DataSource({\n type: "sqlite",\n database: "database.sqlite",\n synchronize: true,\n logging: true,\n entities: [User],\n subscribers: [],\n migrations: [],\n});\n\n// تهيئة الاتصال\nAppDataSource.initialize()\n .then(() => {\n console.log("تم تهيئة مصدر البيانات!");\n })\n .catch((err) => {\n console.error("خطأ أثناء تهيئة مصدر البيانات:", err);\n });\n\n2. أنشئ كيان User في ملف entity/User.ts:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";\n\n@Entity()\nexport class User {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column()\n firstName: string;\n\n @Column()\n lastName: string;\n\n @Column({ unique: true })\n email: string;\n\n @Column({ default: true })\n isActive: boolean;\n}\n\n3. أنشئ ملف index.ts لعرض العمل:
import "reflect-metadata";\nimport { AppDataSource } from "./data-source";\nimport { User } from "./entity/User";\n\nasync function main() {\n await AppDataSource.initialize();\n\n // إنشاء مستخدم جديد\n const user = new User();\n user.firstName = "إيفان";\n user.lastName = "بيتروف";\n user.email = "ivan@example.com";\n user.isActive = true;\n\n // حفظ في قاعدة البيانات\n await AppDataSource.manager