ترحيلات قواعد البيانات في JavaScript (Node.js): الأدوات والتطبيق العملي
\n\nنادرًا ما يخلو تطوير تطبيقات الويب الحديثة على Node.js من العمل مع قواعد البيانات. مع نمو المشروع، يتغير هيكل الجداول والفهارس والعلاقات حتمًا. التنفيذ اليدوي لبرامج SQL النصية على الخادم هو طريق نحو الفوضى والأخطاء. حل هذه المشكلة هو ترحيلات قواعد البيانات (database migrations). وهي آلية لإدارة إصدارات تغييرات المخطط، مما يسمح لفريق المطورين بتحديث هيكل قاعدة البيانات بشكل متزامن وآمن.
\n\nفي نظام JavaScript البيئي، توجد عدة أدوات ناضجة للعمل مع الترحيلات. دعنا نستعرض ثلاثة منهجيات رئيسية من خلال أمثلة على المكتبات الشائعة.
\n\n1. Knex.js — منشئ استعلامات عالمي
\n\nKnex.js ليس مجرد منشئ SQL، بل هو أداة كاملة للترحيلات والتعبئة (إدخال بيانات اختبارية). يدعم PostgreSQL، MySQL، SQLite وأنظمة إدارة قواعد بيانات أخرى. الميزة الرئيسية هي أنك تكتب الترحيلات بلغة JavaScript، ويقوم Knex بترجمتها إلى لهجة قاعدة البيانات المحددة.
\n\nالتثبيت والإعداد
\nnpm install knex\nnpm install pg # لـ PostgreSQL\n\nنقوم بإنشاء ملف الإعداد knexfile.js:
module.exports = {\n development: {\n client: 'pg',\n connection: {\n host: 'localhost',\n user: 'user',\n password: 'pass',\n database: 'mydb'\n },\n migrations: {\n directory: './migrations'\n }\n }\n};\n\nإنشاء وتنفيذ الترحيل
\nلنقم بإنشاء ترحيل لجدول المستخدمين:
\nnpx knex migrate:make create_users_table\n\nسيظهر في مجلد migrations ملف يحمل طابعًا زمنيًا. نقوم بتحريره:
exports.up = function(knex) {\n return knex.schema.createTable('users', (table) => {\n table.increments('id').primary();\n table.string('username', 100).notNullable().unique();\n table.string('email').notNullable();\n table.timestamps(true, true); // created_at و updated_at\n });\n};\n\nexports.down = function(knex) {\n return knex.schema.dropTableIfExists('users');\n};\n\nنقوم بتطبيق الترحيل:
\nnpx knex migrate:latest\n\nالتراجع عن آخر ترحيل:
\nnpx knex migrate:rollback\n\nيسمح Knex أيضًا بتنفيذ SQL خالص داخل الترحيلات إذا كانت هناك حاجة لمنطق محدد.
\n\n2. Sequelize — ORM مع نظام ترحيل قوي
\n\nSequelize هو ORM شائع لـ Node.js، يدعم PostgreSQL، MySQL، MariaDB، SQLite و MSSQL. توفر واجهة الأوامر الخاصة به أوامر مريحة لإنشاء وإدارة الترحيلات، المدمجة بشكل وثيق مع النماذج.
\n\nبدء العمل
\nnpm install sequelize sequelize-cli pg\nnpx sequelize-cli init\n\nنقوم بإنشاء نموذج وترحيل بأمر واحد:
\nnpx sequelize-cli model:generate --name User --attributes username:string,email:string\n\nسيؤدي ذلك إلى إنشاء ملفين: النموذج models/user.js والترحيل في migrations/. مثال على الترحيل:
'use strict';\nmodule.exports = {\n up: async (queryInterface, Sequelize) => {\n await queryInterface.createTable('Users', {\n id: {\n allowNull: false,\n autoIncrement: true,\n primaryKey: true,\n type: Sequelize.INTEGER\n },\n username: {\n type: Sequelize.STRING(100),\n allowNull: false,\n unique: true\n },\n email: {\n type: Sequelize.STRING,\n allowNull: false\n },\n createdAt: {\n allowNull: false,\n type: Sequelize.DATE\n },\n updatedAt: {\n allowNull: false,\n type: Sequelize.DATE\n }\n });\n },\n down: async (queryInterface, Sequelize) => {\n await queryInterface.dropTable('Users');\n }\n};\n\nالتطبيق والتراجع:
\nnpx sequelize-cli db:m