1. مقدمة حول أتلاس

Atlas

أتلاس هو أداة مستقلة عن اللغة مصممة خصيصاً لإدارة وترحيل بنيات قواعد البيانات باستخدام مبادئ DevOps الحديثة. توفر خيارين لسير العمل:

  • تصريحي: يشبه طريقة عمل تيرافورم، يقارن أتلاس الحالة الحالية لقاعدة البيانات مع الحالة المرغوبة المحددة باستخدام HCL أو SQL أو مخطط ORM. بناءً على هذا المقارنة، يولد وينفذ خطة ترحيل لنقل قاعدة البيانات إلى الحالة المرغوبة.
  • مُسند: على عكس الأدوات الأخرى، يخطط أتلاس تلقائيًا لترحيلات البنية الخاصة بك. يمكن للمستخدمون وصف بنية قاعدة البيانات المرغوبة باستخدام HCL أو SQL أو ORM المفضلة لديهم، ومن ثم يمكنهم التخطيط والمراجعة وتطبيق الترحيلات اللازمة للقاعدة البيانات.

ميزة رئيسية لأتلاس هي تبسيط تعقيد إدارة قواعد البيانات، مما يجعلها سهلة للتحكم بالإصدارات والتعاون والتنفيذ.

2. تثبيت أتلاس

قبل استخدام أتلاس لإدارة إصدارات قواعد البيانات، نحتاج إلى تثبيته. فيما يلي خطوات التثبيت لأنظمة التشغيل المختلفة.

2.1 تثبيت على macOS وLinux

في نظام macOS أو Linux، يمكنك تنزيل وتثبيت أحدث إصدار من أتلاس باستخدام الأمر التالي في سطر الأوامر:

curl -sSf https://atlasgo.sh | sh

سيكتشف هذا الأمر تلقائيًا إصدار نظام التشغيل، ويقوم بتنزيل الإصدار المناسب، ويضع ملف البرنامج القابل للتنفيذ في المسار القابل للتنفيذ.

2.2 تثبيت عبر Homebrew

إذا كنت تستخدم macOS ولديك بالفعل مدير الحزم Homebrew، فإن تثبيت أتلاس بسيط كما يلي:

brew install ariga/tap/atlas

سيقوم هذا بجلب أحدث إصدار من أتلاس من مستودع Homebrew وتثبيته.

2.3 تثبيت باستخدام Docker

تثبيت أتلاس وتشغيله عبر Docker هو طريقة سريعة ومريحة، خصوصاً للاختبارات المؤقتة أو للمستخدمين الذين يفضلون عدم تثبيت برمجيات إضافية على نظامهم المضيف.

أولاً، قم بسحب صورة Docker الخاصة بأتلاس:

docker pull arigaio/atlas

ثم، يمكنك تشغيل أمر المساعدة لتأكيد نجاح التثبيت:

docker run --rm arigaio/atlas --help

إذا كان يحتاج الحاوية إلى الوصول إلى شبكة المضيف أو الدلائل المحلية، استخدم العلم --net=host وقم بتوصيل الدلائل المطلوبة:

docker run --rm --net=host \
  -v $(pwd)/migrations:/migrations \
  arigaio/atlas migrate apply \
  --url "mysql://root:pass@:3306/test"

2.4 تثبيت على نظام Windows

قم بتنزيل ملف البرنامج القابل للتنفيذ، من https://release.ariga.io/atlas/atlas-windows-amd64-latest.exe، وأضف مسار التثبيت إلى متغير البيئة PATH في النظام.

3. تصدير هيكل الجدول الموجود في قاعدة البيانات باستخدام Atlas

يوفر Atlas الأمر atlas schema inspect، الذي يمكن استخدامه لتصدير هيكل قاعدة بيانات موجودة. يدعم هذا الأمر قراءة وصف قاعدة البيانات من عنوان URL لقاعدة البيانات ويخرجها بثلاثة تنسيقات مختلفة: تنسيق Atlas HCL الافتراضي وتنسيق SQL وتنسيق JSON. في هذا الدليل، سنريك كيفية استخدام تنسيقي Atlas HCL وSQL، حيث يتم استخدام تنسيق JSON عادة لمعالجة الإخراج باستخدام jq.

لفحص مثيل MySQL يعمل محلياً وكتابة الإخراج إلى ملف يسمى schema.hcl، استخدم الأمر التالي:

atlas schema inspect -u "mysql://root:pass@localhost:3306/example" > schema.hcl

افتح ملف schema.hcl لعرض تعريف Atlas لهيكل الجدول الذي يصف قاعدة البيانات (HCL هو تنسيق تكوين هيكل الجدول الذي لا يعتمد على قاعدة بيانات والذي يُعرف بواسطة Atlas). على سبيل المثال، سيحتوي هذا الملف على المحتوى التالي:

table "users" {
  schema = schema.example
  column "id" {
    null = false
    type = int
  }
  column "name" {
    null = true
    type = varchar(100)
  }
  primary_key {
    columns = [column.id]
  }
}

يُمثل هذا الكود الجدول بـ عمودي "id" و "name". يشير الحقل "schema" إلى تعريف نموذج "example" المعرف في أماكن أخرى في هذا المستند. بالإضافة إلى ذلك، يُحدد الحاصل الفارز "primary_key" العمود "id" كالمفتاح الرئيسي للجدول. يسعى Atlas إلى تقليد بناء الجملة لقاعدة البيانات التي يتم العمل عليها. في هذا المثال، العمود "id" لديه نوع "int"، بينما العمود "name" لديه نوع "varchar(100)".

بالمثل، لتصدير تعريف النموذج SQL لقاعدة البيانات، يمكنك استخدام الأمر التالي:

atlas schema inspect -u "mysql://root:pass@localhost:3306/example" --format '{{ sql . }}' > schema.sql

افتح ملف schema.sql لعرض الوصف SQL لقاعدة البيانات، والذي يحتوي عادة على بعض عبارات CREATE TABLE.

يجعل هذا النهج من السهل فهم تفاصيل هيكل الجدول في قاعدة البيانات الحالية ويوفر مرجع دقيق للهجرات النمطية اللاحقة.

4.1 السير العمل الاستعاري

يسمح سير العمل الاستعاري في Atlas للمستخدمين بتحديد الحالة النهائية المرجوة لقاعدة البيانات بشكل استعاري. يحتاج المستخدمون فقط إلى وصف ما يريدون أن تكون الحالة النهائية لمخطط قاعدة البيانات، وسيقوم أداة Atlas تلقائيًا بتوليد وتنفيذ خطط الهجرة للانتقال بشكل آمن من حالة قاعدة البيانات الحالية إلى هذه الحالة المتوقعة.

أدناه يوجد كيفية استخدام السير العمل الاستعاري لتعريف وتحقيق حالة قاعدة البيانات المرجوة:

4.1.1 تحديد هيكل الجدول المستهدف

أولاً، تحتاج إلى إنشاء ملف يحدد هيكل قاعدة البيانات المتوقع، الذي يمكن أن يكون بتنسيق HCL، SQL، أو ORM (Object-Relational Mapping).

عند استخدام تنسيق HCL كمثال، قم بتعريف جدول "blog_posts" جديد:

table "blog_posts" {
  schema = schema.example
  column "id" {
    null = false
    type = int
  }
  column "title" {
    null = true
    type = varchar(100)
  }
  column "body" {
    null = true
    type = text
  }
  column "author_id" {
    null = true
    type = int
  }
  primary_key {
    columns = [column.id]
  }
  foreign_key "author_fk" {
    columns     = [column.author_id]
    ref_columns = [table.users.column.id]
  }
}

نصيحة: سيتم التطرق إلى تنسيق HCL في القسم اللاحق.

4.1.2 أداء الهجرة باستخدام أداة Atlas

بمجرد أن يتم إكمال تعريف هيكل قاعدة البيانات، يمكنك استخدام أمر schema apply من Atlas لأداء الهجرة.

atlas schema apply \
  -u "mysql://root:pass@localhost:3306/example" \
  --to file://schema.hcl

بعد تنفيذ الأمر أعلاه، سيقوم Atlas بمقارنة هيكل قاعدة البيانات الحالية مع الهيكل المعرف في الملف، وتوجيه خطة الهجرة، ثم طلب تأكيد من المستخدم لتنفيذه. بمجرد أن يؤكد المستخدم خطة التنفيذ، سيقوم Atlas بأداء الهجرة على قاعدة البيانات وتحديثها إلى الحالة المرجوة.

4.2 سير العمل النسقي

سير العمل النسقي هو وضع استخدام آخر مدعوم من قبل Atlas، ويُطلق عليه أحيانًا "الهجرة المعتمدة على التغيير". وهو مناسب للسيناريوهات التي يحتاج فيها تغيير هيكل قاعدة البيانات إلى تحكم الإصدار ومراجعته في عملية مراجعة الكود.

تتضمن خطوات سير العمل النسقي:

4.2.1 حساب الفروقات

قبل بدء الترحيل، من الضروري مقارنة هيكل قاعدة البيانات الحالي مع الحالة المرغوبة وتحديد الاختلافات بينهما. يمكن تحقيق ذلك عن طريق تشغيل أمر atlas migrate diff.

atlas migrate diff create_blog_posts \
  --dir "file://migrations" \
  --to "file://schema.hcl" \
  --dev-url "docker://mysql/8/example"

يُحدد --dir عنوان URL لمجلد الترحيل، مع الافتراض الأساسي هو file://migrations. يُحدد --to عنوان URL للحالة المرغوبة (على سبيل المثال، قاعدة البيانات في بيئة التطوير الخاصة بك)، ويُوفر --dev-url عنوان URL لقاعدة بيانات التطوير المستخدمة لحساب الاختلافات (يرجى ملاحظة أنه يجب أن يُحدد --dev-url قاعدة بيانات فارغة يستخدمها Atlas لحساب الاختلافات).

نصيحة: إذا كنت ترغب في إنشاء ملفات SQL، يرجى الرجوع إلى القسم السابق لضبط التنسيق باستخدام المعامل --format.

4.2.2 تطبيق تغييرات الترحيل

بعد اكتمال حساب الفروقات، سيقوم Atlas بإنشاء ملفي ترحيل محفوظين في مجلد migrations. على سبيل المثال، إذا كان التنسيق المحدد هو SQL، فإن الملفات التي تم إنشاؤها من قبل أمر diff، مثل الملف الـ SQL التالي، تحتوي على أوامر الترحيل لإنشاء جدول جديد:

-- إنشاء جدول "blog_posts"
CREATE TABLE `blog_posts` (
  `id` int NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  `body` text DEFAULT NULL,
  `author_id` int NULL REFERENCES `users`(id),
  PRIMARY KEY (`id`)
);

بمجرد إنشاء ملفات الترحيل، يُمكنك استخدام أدوات التحكم في الإصدارات (على سبيل المثال، Git) لإدارة هذه التغييرات. تتيح هذه الطريقة إجراء تعديلات كثيرة على هيكل جداول قاعدة البيانات في بيئة التطوير، وعندما يحين الوقت للنشر، مقارنة بيئة التطوير وبيئة UAT باستخدام أوامر Atlas لإنشاء ملفات ترحيل هيكل جداول قاعدة البيانات. يُمكن بعد ذلك تطبيق هذه الملفات على بيئات UAT والإنتاج لترقية قاعدة البيانات.

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

5. وصف تنسيق HCL

5.1 المقدمة

HCL هي لغة تصريحية تُستخدم لوصف تعريفات هيكل جداول قاعدة بيانات. يستخدم Atlas تنسيق HCL لكتابة مخططات قواعد البيانات، مما يوفر هيكلًا غنيًا لوصف جوانب مختلفة من قاعدة البيانات. تكمن ميزة HCL في قراءتها، وسهولة الصيانة بها، ودعم الميزات مثل حقن المتغيرات والتعليقات الإضافية.

نصيحة: إذا كان مشروعك بحاجة للتكيف مع قواعد بيانات متعددة، يمكن أن يكون وصف هيكل الجداول بطريقة مناسبة للقاعدة المستقلة باستخدام HCL مريحًا للغاية.

5.2 كائن schema

يُستخدم الكائن schema لوصف مخطط قاعدة البيانات. في MySQL وSQLite، يمثل DATABASE، بينما في PostgreSQL، يمثل SCHEMA. يُمكن أن يحتوي ملف HCL على كائن واحد أو أكثر من كائنات schema.

schema "public" {
  comment = "تعليق على المخطط"
}

schema "private" {}

5.3 كائن table

يُستخدم كائن table لوصف جدول في قاعدة بيانات SQL، بما في ذلك الأعمدة والفهارس والقيود والخصائص الإضافية المختلفة التي يدعمها مختلف محركات قواعد البيانات.

table "users" {
  schema = schema.public
  column "id" {
    type = int
  }
  column "name" {
    type = varchar(255)
  }
  column "manager_id" {
    type = int
  }
  primary_key {
    columns = [
      column.id
    ]
  }
  index "idx_name" {
    columns = [
      column.name
    ]
    unique = true
  }
  foreign_key "manager_fk" {
    columns     = [column.manager_id]
    ref_columns = [table.users.column.id]
    on_delete   = CASCADE
    on_update   = NO_ACTION
  }
}

5.4 كائن column

يُستخدم كائن column كمورد فرعي للـ table، يُستخدم لتعريف الأعمدة في الجدول.

column "name" {
  type = text
  null = false
}

column "age" {
  type = integer
  default = 42
}

column "active" {
  type = tinyint(1)
  default = true
}

5.5 كائن primary_key

الكائن primary_key هو كائن فرعي للجدول table الذي يحدد المفتاح الأساسي للجدول.

primary_key {
  columns = [column.id]
}

5.6 كائن foreign_key

الكائن foreign_key هو كائن فرعي للجدول table الذي يحدد الأعمدة التي تشير إلى الأعمدة في جداول أخرى.

table "orders" {
  schema = schema.market
  // ...
  column "owner_id" {
    type = integer
  }
  foreign_key "owner_id" {
    columns     = [column.owner_id]
    ref_columns = [table.users.column.id]
    on_update   = NO_ACTION
    on_delete   = NO_ACTION
  }
}

5.7 كائن index

الكائن index يمثل فهرسًا في الجدول.

index "idx_name" {
  columns = [
    column.name
  ]
  unique = true
}