TypeORM لجافا سكريبت (Node.js): دليل شامل
1. ما هي TypeORM ولماذا تستخدمها؟
TypeORM هي مكتبة قوية من نوع Object-Relational Mapping (ORM) مصممة للعمل مع قواعد البيانات في بيئة Node.js. تدعم المكتبة كلاً من TypeScript وJavaScript، وتوفر للمطورين طريقة سهلة للتفاعل مع قواعد البيانات العلائقية (PostgreSQL, MySQL, MariaDB, SQLite, Microsoft SQL Server, Oracle و CockroachDB) من خلال نهج كائني التوجه. بدلاً من كتابة استعلامات SQL يدويًا، يمكنك العمل مع الكيانات (Entities) وهي عبارة عن كلاسات JavaScript عادية يتم تعيينها تلقائيًا إلى جداول قاعدة البيانات.
لماذا تحتاج إلى TypeORM؟ أولاً، تعمل على تسريع عملية التطوير بشكل كبير: لن تحتاج إلى كتابة استعلامات SQL يدويًا لعمليات CRUD (إنشاء، قراءة، تحديث، حذف). ثانيًا، توفر أمانًا للأنواع (إذا كنت تستخدم TypeScript) وحماية من هجمات حقن SQL (SQL Injection) بفضل استخدام الاستعلامات ذات المعاملات. ثالثًا، توفر TypeORM أداة Query Builder قوية للاستعلامات المعقدة، وأداة Migrations لإدارة هيكل قاعدة البيانات، بالإضافة إلى دعم العلاقات بين الجداول (واحد لواحد، واحد لكثير، كثير لكثير). هذا يجعلها الخيار الأمثل لبناء تطبيقات قابلة للتوسع وسهلة الصيانة.
على عكس بعض ORM الأخرى، تستخدم TypeORM بشكل فعال الـ Decorators (في TypeScript) أو الـ Annotations (في JavaScript عبر الميزات التجريبية)، مما يجعل الكود تصريحيًا وبديهيًا. تدعم المكتبة أيضًا نمطي Active Record و Data Mapper، مما يتيح للمطور اختيار أسلوب العمل الأنسب له. بفضل مرونتها وميزاتها الغنية، تعتبر TypeORM واحدة من أشهر مكتبات ORM في نظام Node.js البيئي.
2. التثبيت
لتثبيت TypeORM في مشروع Node.js الخاص بك، استخدم مدير الحزم npm. ستحتاج أيضًا إلى تثبيت مشغل (Driver) لقاعدة البيانات التي تستخدمها. فيما يلي الأوامر الخاصة بأنظمة إدارة قواعد البيانات الأكثر شيوعًا.
# تثبيت TypeORM
npm install typeorm --save
# تثبيت مشغل PostgreSQL
npm install pg --save
# تثبيت مشغل MySQL / MariaDB
npm install mysql2 --save
# تثبيت مشغل SQLite
npm install sqlite3 --save
# تثبيت مشغل Microsoft SQL Server
npm install mssql --save
# تثبيت مشغل CockroachDB
npm install pg --save
# بالنسبة لـ TypeScript، قم أيضًا بتثبيت reflect-metadata والأنواع
npm install reflect-metadata --save
npm install @types/node --save-dev
بعد التثبيت، تأكد من تضمين الإعدادات التالية في ملف tsconfig.json (إذا كنت تستخدم TypeScript):
{
"emitDecoratorMetadata": true,
"experimentalDecorators": true
}
بالنسبة لـ JavaScript (Node.js)، هذه الإعدادات غير مطلوبة، ولكن يمكنك استخدام الـ Decorators التجريبية إذا أردت.
3. بداية سريعة — مثال عملي بسيط
لنقم بإنشاء تطبيق بسيط يتصل بقاعدة بيانات SQLite (قاعدة بيانات ملفية، لا تتطلب تثبيت خادم) وينفذ عمليات أساسية.
قم بإنشاء ملف index.js وأضف الكود التالي:
const { createConnection, EntitySchema } = require("typeorm");
// تعريف الكيان (Entity) باستخدام EntitySchema
const UserSchema = new EntitySchema({
name: "User",
tableName: "users",
columns: {
id: {
primary: true,
type: "int",
generated: true
},
firstName: {
type: "varchar"
},
lastName: {
type: "varchar"
}
}
});
// إنشاء الاتصال بقاعدة البيانات
createConnection({
type: "sqlite",
database: "database.sqlite",
entities: [UserSchema],
synchronize: true,
logging: false
}).then(async connection => {
console.log("تم الاتصال بقاعدة البيانات بنجاح!");
// الحصول على مستودع الكيان
const userRepository = connection.getRepository(UserSchema);
// إنشاء مستخدم جديد
const newUser = userRepository.create({
firstName: "أحمد",
lastName: "محمد"
});
await userRepository.save(newUser);
console.log("تم إنشاء المستخدم:", newUser);
// قراءة جميع المستخدمين
const allUsers = await userRepository.find();
console.log("جميع المستخدمين:", allUsers);
// تحديث مستخدم
const userToUpdate = allUsers[0];
userToUpdate.lastName = "علي";
await userRepository.save(userToUpdate);
console.log("تم تحديث المستخدم:", userToUpdate);
// حذف مستخدم
await userRepository.remove(userToUpdate);
console.log("تم حذف المستخدم");
// إغلاق الاتصال
await connection.close();
}).catch(error => {
console.error("خطأ في الاتصال بقاعدة البيانات:", error);
});
قم بتشغيل التطبيق باستخدام الأمر node index.js. ستلاحظ أنه تم إنشاء ملف قاعدة البيانات database.sqlite وتم تنفيذ العمليات بنجاح.