Sequelize

From binaryoption
Revision as of 04:18, 21 April 2025 by Admin (talk | contribs) (@pipegas_WP-test)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
Баннер1
    1. Sequelize: دليل شامل للمبتدئين

Sequelize هو إطار عمل (Framework) لـ Object-Relational Mapping (ORM) مبني على Node.js. يتيح لك Sequelize التفاعل مع قواعد البيانات العلائقية (مثل MySQL، PostgreSQL، SQLite، و MSSQL) باستخدام لغة JavaScript، بدلاً من كتابة استعلامات SQL مباشرة. هذا يسهل عملية تطوير تطبيقات Node.js التي تتطلب تخزين واسترجاع البيانات. في هذا المقال، سنستكشف Sequelize بعمق، بدءًا من المفاهيم الأساسية وحتى الاستخدامات المتقدمة، مع التركيز على الفوائد التي يقدمها للمطورين.

ما هو Object-Relational Mapping (ORM)؟

قبل الغوص في تفاصيل Sequelize، من المهم فهم مفهوم الـ ORM. الـ ORM هو تقنية برمجية تعمل كجسر بين البرمجة الكائنية (Object-Oriented Programming) المستخدمة في Node.js وقواعد البيانات العلائقية. بدلاً من كتابة استعلامات SQL معقدة للوصول إلى البيانات، يسمح لك الـ ORM بالتعامل مع البيانات ككائنات JavaScript.

  • الفوائد الرئيسية للـ ORM:
   *   زيادة الإنتاجية: يقلل من كمية التعليمات البرمجية المطلوبة للتفاعل مع قاعدة البيانات.
   *   تحسين قابلية الصيانة: يجعل التعليمات البرمجية أكثر قابلية للقراءة والفهم والصيانة.
   *   الأمان: يساعد في منع هجمات حقن SQL (SQL Injection) عن طريق تجريد الاستعلامات.
   *   قابلية النقل: يسهل تغيير قاعدة البيانات المستخدمة دون الحاجة إلى إعادة كتابة الكثير من التعليمات البرمجية.

لماذا نختار Sequelize؟

Sequelize هو خيار شائع بين مطوري Node.js بسبب العديد من الميزات التي يقدمها:

  • دعم قواعد بيانات متعددة: يدعم مجموعة واسعة من قواعد البيانات العلائقية.
  • واجهة برمجة تطبيقات (API) سهلة الاستخدام: يوفر واجهة برمجة تطبيقات بسيطة وواضحة.
  • النماذج (Models): يسمح بتعريف نماذج JavaScript التي تمثل جداول قاعدة البيانات.
  • الارتباطات (Associations): يدعم تعريف العلاقات بين النماذج المختلفة (مثل علاقة واحد لأحد، علاقة واحد لأكثر، علاقة متعدد لأكثر).
  • التحقق من الصحة (Validation): يوفر آليات للتحقق من صحة البيانات قبل حفظها في قاعدة البيانات.
  • المعاملات (Transactions): يدعم تنفيذ المعاملات لضمان اتساق البيانات.
  • التوسع (Scalability): مصمم للتعامل مع التطبيقات الكبيرة والمعقدة.
  • المجتمع النشط: يتمتع Sequelize بمجتمع كبير ونشط، مما يوفر الكثير من الموارد والدعم.

تثبيت Sequelize

لتثبيت Sequelize، استخدم مدير الحزم npm (Node Package Manager):

```bash npm install sequelize ```

بالإضافة إلى Sequelize، تحتاج إلى تثبيت حزمة قاعدة البيانات التي تريد استخدامها. على سبيل المثال، لتثبيت دعم MySQL:

```bash npm install mysql2 ```

أو PostgreSQL:

```bash npm install pg ```

تهيئة Sequelize

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

```javascript const { Sequelize } = require('sequelize');

const sequelize = new Sequelize('اسم_قاعدة_البيانات', 'اسم_المستخدم', 'كلمة_المرور', {

 host: 'localhost',
 dialect: 'mysql' // أو 'postgres' أو 'sqlite' أو 'mssql'

});

async function testConnection() {

 try {
   await sequelize.authenticate();
   console.log('Connection has been established successfully.');
 } catch (error) {
   console.error('Unable to connect to the database:', error);
 }

}

testConnection(); ```

في هذا المثال، قمنا بإنشاء مثيل جديد من Sequelize وتعيين معلومات الاتصال بقاعدة البيانات. ثم استخدمنا الدالة `authenticate()` للتحقق من الاتصال بقاعدة البيانات.

تعريف النماذج (Models)

النماذج هي جوهر Sequelize. تمثل النماذج جداول قاعدة البيانات وتعريف خصائصها (الأعمدة).

```javascript const { Sequelize, DataTypes } = require('sequelize');

const sequelize = new Sequelize('اسم_قاعدة_البيانات', 'اسم_المستخدم', 'كلمة_المرور', {

 host: 'localhost',
 dialect: 'mysql'

});

const User = sequelize.define('User', {

 firstName: {
   type: DataTypes.STRING,
   allowNull: false
 },
 lastName: {
   type: DataTypes.STRING
 },
 email: {
   type: DataTypes.STRING,
   unique: true
 }

});

async function createTable() {

 try {
   await sequelize.sync(); // يقوم بإنشاء الجدول إذا لم يكن موجودًا
   console.log('Table created successfully!');
 } catch (error) {
   console.error('Unable to create table:', error);
 }

}

createTable(); ```

في هذا المثال، قمنا بتعريف نموذج `User` بثلاث خصائص: `firstName` (اسم الأول)، `lastName` (اسم الأخير)، و `email` (البريد الإلكتروني). استخدمنا `DataTypes.STRING` لتحديد نوع البيانات لكل خاصية. كما حددنا أن `firstName` مطلوب (لا يمكن أن يكون فارغًا) وأن `email` يجب أن يكون فريدًا. ثم استخدمنا `sequelize.sync()` لإنشاء الجدول في قاعدة البيانات إذا لم يكن موجودًا.

العمليات الأساسية على النماذج

بعد تعريف النموذج، يمكنك إجراء عمليات أساسية عليه، مثل:

  • إنشاء (Create): إضافة سجل جديد إلى الجدول.
  • قراءة (Read): استرجاع سجل أو سجلات من الجدول.
  • تحديث (Update): تعديل سجل موجود في الجدول.
  • حذف (Delete): إزالة سجل من الجدول.

```javascript // إنشاء async function createUser() {

 try {
   const user = await User.create({
     firstName: 'John',
     lastName: 'Doe',
     email: '[email protected]'
   });
   console.log('User created successfully:', user.toJSON());
 } catch (error) {
   console.error('Unable to create user:', error);
 }

}

// قراءة async function readUsers() {

 try {
   const users = await User.findAll();
   console.log('Users:', users.map(user => user.toJSON()));
 } catch (error) {
   console.error('Unable to read users:', error);
 }

}

// تحديث async function updateUser(id) {

 try {
   const user = await User.findByPk(id);
   if (user) {
     user.firstName = 'Jane';
     await user.save();
     console.log('User updated successfully:', user.toJSON());
   } else {
     console.log('User not found.');
   }
 } catch (error) {
   console.error('Unable to update user:', error);
 }

}

// حذف async function deleteUser(id) {

 try {
   const user = await User.findByPk(id);
   if (user) {
     await user.destroy();
     console.log('User deleted successfully.');
   } else {
     console.log('User not found.');
   }
 } catch (error) {
   console.error('Unable to delete user:', error);
 }

}

// استدعاء الدوال createUser(); readUsers(); updateUser(1); deleteUser(1); ```

الارتباطات (Associations)

تسمح لك الارتباطات بتعريف العلاقات بين النماذج المختلفة. هناك ثلاثة أنواع رئيسية من الارتباطات:

  • واحد لواحد (One-to-One): كل سجل في النموذج الأول يرتبط بسجل واحد فقط في النموذج الثاني.
  • واحد لأكثر (One-to-Many): كل سجل في النموذج الأول يرتبط بالعديد من السجلات في النموذج الثاني.
  • متعدد لأكثر (Many-to-Many): العديد من السجلات في النموذج الأول ترتبط بالعديد من السجلات في النموذج الثاني.

```javascript // تعريف نموذج Post const Post = sequelize.define('Post', {

 title: {
   type: DataTypes.STRING,
   allowNull: false
 },
 content: {
   type: DataTypes.TEXT
 }

});

// تعريف الارتباط بين User و Post (واحد لأكثر) User.hasMany(Post); Post.belongsTo(User);

async function createAssociations() {

 try {
   await sequelize.sync(); // قم بمزامنة النماذج لإنشاء الجداول والعلاقات
   console.log('Associations created successfully!');
 } catch (error) {
   console.error('Unable to create associations:', error);
 }

}

createAssociations(); ```

في هذا المثال، قمنا بتعريف نموذج `Post` وإنشاء ارتباط بين `User` و `Post` باستخدام `hasMany` و `belongsTo`. يشير هذا إلى أن كل مستخدم يمكن أن يكون لديه العديد من المنشورات، وأن كل منشور ينتمي إلى مستخدم واحد.

الاستعلامات المتقدمة

يوفر Sequelize العديد من الأدوات للاستعلامات المتقدمة، مثل:

  • WHERE: لتحديد الشروط التي يجب أن تستوفيها السجلات.
  • ORDER BY: لترتيب السجلات.
  • LIMIT: لتحديد عدد السجلات التي يتم استرجاعها.
  • OFFSET: لتحديد الإزاحة (عدد السجلات التي يتم تخطيها).
  • GROUP BY: لتجميع السجلات.
  • JOIN: لربط الجداول المختلفة.

```javascript // الاستعلام عن المستخدمين الذين تبدأ أسماؤهم بحرف "J" async function findUsersStartingWithJ() {

 try {
   const users = await User.findAll({
     where: {
       firstName: {
         [Sequelize.Op.startsWith]: 'J'
       }
     }
   });
   console.log('Users starting with J:', users.map(user => user.toJSON()));
 } catch (error) {
   console.error('Unable to find users:', error);
 }

}

findUsersStartingWithJ(); ```

المعاملات (Transactions)

تسمح لك المعاملات بتجميع سلسلة من العمليات على قاعدة البيانات في وحدة واحدة. إذا فشلت أي عملية في المعاملة، يتم التراجع عن جميع العمليات الأخرى، مما يضمن اتساق البيانات.

```javascript async function transferMoney(fromUser, toUser, amount) {

 const transaction = await sequelize.transaction();
 try {
   // خصم المبلغ من حساب المستخدم المرسل
   await fromUser.update({ balance: fromUser.balance - amount }, { transaction });
   // إضافة المبلغ إلى حساب المستخدم المستلم
   await toUser.update({ balance: toUser.balance + amount }, { transaction });
   await transaction.commit();
   console.log('Money transferred successfully.');
 } catch (error) {
   await transaction.rollback();
   console.error('Unable to transfer money:', error);
 }

} ```

الخلاصة

Sequelize هو إطار عمل ORM قوي ومرن يوفر العديد من الميزات التي تسهل عملية تطوير تطبيقات Node.js التي تتفاعل مع قواعد البيانات العلائقية. من خلال فهم المفاهيم الأساسية والاستخدامات المتقدمة لـ Sequelize، يمكنك زيادة إنتاجيتك وتحسين جودة التعليمات البرمجية الخاصة بك.

روابط ذات صلة (الخيارات الثنائية والتحليل الفني)

ابدأ التداول الآن

سجّل في IQ Option (الحد الأدنى للإيداع 10 دولار) افتح حساباً في Pocket Option (الحد الأدنى للإيداع 5 دولار)

انضم إلى مجتمعنا

اشترك في قناة Telegram الخاصة بنا @strategybin لتصلك: ✓ إشارات تداول يومية ✓ تحليلات استراتيجية حصرية ✓ تنبيهات اتجاهات السوق ✓ مواد تعليمية للمبتدئين

Баннер