3  تشغيل قاعدة البيانات

السؤال: كيف أوجه خطابي بلغة SQL لنظام قاعدة البيانات؟

الجواب في ثلاث خطوات:

  1. تهيئة البيئة
  2. تنزيل وتثبيت وتشغيل خدمة قاعدة البيانات
  3. الاتصال وإرسال الأوامر والحصول على النتائج

أولاً: تهيئة بيئة التشغيل

قاعدة البيانات (Database) هي برمجيَّة -كغيرها من البرمجيات- تم تجميعها (compiled) فصارت تعليمات ثنائية (binary instructions) ليتم تنفيذها على العتاد (hardware) بحسبه بمجرَّد تشغيلها، وهي المعروفة في نظام ويندوز بالاختصار (exe) ويعني القابل للتشغيل (executable).

وللبرمجية حالتان:

  1. حالة ركود: وهي صورة محفوظة للبرمجية القابلة للتنفيذ
  2. حالة جريان: وهي انعكاس لهذه الصورة في الذاكرة، يتم تنفيذها. وتسمى حينئذٍ إجراء (Process) بالنسبة لنظام التشغيل (OS) وهذا يعني أنه سيتم حجز مساحة في الذاكرة وموارد للمعالجة ونحو ذلك.

والبرمجية تعمل في بيئة؛ وهي الظرف الذي يعمل فيه من:

  1. معماريَّة المعالج (CPU Architecture) مثل: x86/x64 أو ARM
  2. نظام التشغيل (OS) وما يديره من موارد:
    • الذاكرة
    • وأجهزة الإدخال والإخراج (I/O Devices) ومن أهمها:
      • الشبكة (وما تتصل به عبرها)
      • المخزن (وما تحفظ فيها)
  3. برمجيات مثبتة: الثنائيات (bins) والمكتبات (libs)
  4. ملفات التهيئة (configuration files)

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

… إلى أن تبلورَ في المجتمع البرمجي فكرة جديدة. وهي إعادة النظر في الوِحدة الصغرى لما هو قابل للتشغيل أصلاً! فجعلوا الحزمة شيئًا أكبر من مجرد الثنائيات المجمعة (compiled binaries) والمكتبات و ملفات التهيئة. فظهرت برمجيات دوكر (Docker) معتمدة على تجريدات جديدة في نظام التشغيل لتعطي المبرمج مجموعة أدوات لوصف وإنشاء جميع العناصر البرمجيَّة ذات الصلة في حزمة واحدة. وتتولى منصة دوكر -المثبتة على الجهاز- تشغيل هذة الحزمة بمعزِل عن غيرها كي لا يحصل أي نوع من أنواع التعارُض.

فالذي يتعلم هذه الأداة ويستعملها يرى الفوائد التالية:

  1. تحسين تجرِبة التطوير حيث يكون التركيز على حل المشاكل الحقيقية؛ أي: الناشئة من التطبيق نفسه لا في البيئة التي هو فيها
  2. تسهيل التعاون بين المبرمجين؛ إذْ كل مبرمج له جهازه الذي هو بيئة مختلفة
  3. تسهيل التنقل بين المشاريع حتى للمبرمج الواحد في نفس الجهاز بإيقاف الحزمة الأولى وتشغيل الثانية (سيأتي الكلام عن نَظم البرمجيات إن شاء الله)
  4. تسهيل التعاون بين المشغِّل والمطوِّر؛ إذ تم تجريد قدر كبير من التفاصيل عبر توسيع نطاق مفهوم الحزمة القابلة للتشغيل.

خلفية (إثرائية)

مفهوم الافتراضية

ظهرت فكرة الافتراضية (Virtualization) -عام 1966- بمعنى تقسيم موارد الحواسيب الكبيرة (Mainframes) باهظة الثمن إلى حواسيب متخيَّلة متعددة لتحقيق استخدام وكفاءة أفضل (كأنها مبنى واحد يتم تقسيمه إلى وحدات متعددة للتأجير على عدة مستفيدين). ونموذج الحوسَبة السحابية مبني على هذا الأصل.

أخيرًا تطوَّرت الآلية لنموذج الحاوية (Containerization) حيث كان مشروعًا داخليًّا في شركة دوت كلاود (dotCloud) منذ 2008 في فرنسا. ثم تم إطلاق دوكر (Docker) كمشروع مفتوح المصدر في مارس 2013 على يد سولومون هايكس (Solomon Hykes).

الفرق بين الجهاز الافتراضي والحاوية

الجهاز الافتراضي (VM) والحاوية (Container) كلاهما بيئة تشغيلية معزولة منبثقة من صورة (Image) تتضمن الثنائيات والمكتبات والإعدادات اللازمة لتشغيل التطبيق (يُضاف إلى تلك الصورة النص البرمجي للتطبيق نفسه).

الفرق بينهما هو أن صورة الجهاز الافتراضي (VM Image) أساسها نظام تشغيل كامل (OS)، بينما صورة الحاوية (Container Image) أساسها النواة (kernel) المشتركة لنظام التشغيل المستضيف (Host OS)؛ وهذا يجعل الحاويات خفيفة من ثلاث أوجه:

  1. من حيث الكفاءة في استهلاك الموارد (المعالجة والذاكرة والتخزين)
  2. ومن حيث سرعة التشغيل والإيقاف
  3. ومن حيث سهولة التعامل معها

ثانيًا: تنزيل وتثبيت وتشغيل خدمة قاعدة البيانات

يُرجى منك تنزيل وتثبيت وتشغيل دوكر على جهازك؛ وذلك باتباع الخطوات الموجودة في هذا الرابط من الموقع الرسمي لدوكر نفسه.

بعد تشغيل دوكر .. يمكننا الآن النظر في مستودَع الصُّور DockerHub للحصول على صورة لقاعدة بيانات مشهورة هي: بوستقرس (Postgres). ستجد من ضمن الأقسام في هذه الصفحة:

ومن قسم متغيرات البيئة (Environment Variables) نجد أن هذه الحاوية تعتمد على ضبط هذه المتغيرات، وسنكتبها ونحفظها في ملف (.env - حرف النقطة أولاً) ثم سنشير إليه فيما بعد:

POSTGRES_HOST=127.0.0.1
POSTGRES_DB=mydatabase
POSTGRES_USER=user
POSTGRES_PASSWORD=secret

ثم سنكتب ملف (compose.yaml) الذي نعرف فيه الخدمات، وليس لدينا إلا خدمة واحدة وهي: db (وقد نسميها أي شيء آخر). لاحظ أن هذا الملف يتبع طريقة كتابة YAML التي من أهم قواعدها أن التضمين يحصل مثل بايثون؛ بدفع المضمَّن إلى الداخل بالمسافات البيضاء كما ترى:

services:
  db:
    image: postgres:17.6
    env_file:
      - .env
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

وهذا شرحها:

  • أما image: postgres:17.6 فهو تحديد اسم الصورة التي تنبثق منها الحاوية. وسيتم -عند التشغيل- البحث في DockerHub تلقائيًّا للبحث عنها وتنزيلها وتثبيتها.
  • ثم env_file وهي إشارة إلى ملف متغيرات البيئة الذي عرفناه مسبقًا باسم: .env
  • المنافذ: ports وهو من الخارج للداخل: منفذ المضيف ثم منفذ الحاوية. وقد اخترنا هذا الرقم لأننا نعرف من إعدادات الصورة في موقع DockerHub أن خدمة postgres تستعمله تلقيًّا.
  • وحدات التخزين volumes تم تسمية وحدة pgdata (المعرفة في الأسفل) وربطها بالمسار الذي تخزن فيه قاعدة البيانات داخل الحاوية بياناتها بالفعل. وذلك يعني أن كل ما تخزنه سينتقل بشكل تلقائي إلى تلك الوحدة التخزينية خارِج الحاوية، وتبقى محفوظة حتى بعد انعدام الحاوية.

ثم نأمر docker compose بقراءة الوصف وتشغيله up:

docker compose up

وإذا أردنا إيقافها نقول down:

docker compose down

ثالثًا: الاتصال وإرسال الأوامر والحصول على النتائج

وسنبدأ أولاً بالطريقة الصعبة في الاتصال بقاعدة البيانات ثم ننتقل للطريقة السهلة:

  1. الطريقة الصعبة: الاتصال عن طريقة واجهة سطر الأوامر، المسماة:psql
  2. الطريقة السهلة: الاتصال عن طريق واجهة رسومية، المسماة: Adminer

وسنرى في الدرس القادم كيف نتصل من بايثون نفسها.

الطريقة الصعبة: الواجهة النصية

أولاً: يجب أن ندخل إلى الحاوية المشغلة، وذلك يتم لنا بهذا الأمر:

docker exec -it $(docker compose ps -q db) sh

نفككه:

  • الأمر docker exec يعني تشغيل أمر داخل حاوية .. وهذا الأمر الذي نريده هو sh
  • أما -it فهي علامتان لنفس الأمر
  • ثم علامة $ متبوعة بأمر بين قوسين: $(docker compose ps -q db): هذا يتم تنفيذه أولاً للحصول على معرِّف (ID) الحاوية، ويتم استعماله كمُعطى للأمر الأوَّل (docker exec)

بعد أن فتحنا صدفة الحاوية المشغلة (sh)، يمكننا كتابة أمر فتح برنامج سطر الأوامر المسمى psql وتمرير المعطيات المطلوبة:

psql -h 127.0.0.1 -U admin postgres

ومن هنا يمكننا كتابة أوامِر SQL وأشباه الأوامر (meta-commands) التي لها المعاني التالية:

  • عرض المخططات: \l
  • الاتصال بمخطط: \c <db>
  • عرض الجداول: \d
  • الخروج: \q

الطريقة السهلة: الواجهة البصرية

إذا كنت تستعمل محرر VS Code أو شيئًا مبنيًّا على أساسه مثل Cursor أو Codium وغيرهما. يمكنك تثبيت إضافة Database Client من المتجر ونسخ المعطيات من ملف .env الذي سبق تعريفه بعد اختيار قاعدة البيانات Postgres من الخيارات.

وإذا كنت تريد واجهة غير متصلة بالمحرر نفسه، فلديك خيار وصف خدمة Adminer في نفس ملف وصف الخدمات على النحو التالي:

services:
  adminer:
    image: adminer
    ports:
      - 8080:8080

ليكون الملف كاملاً فيه خدمتان:

  1. خدمة قاعدة البيانات (db)
  2. خدمة الواجهة الرسومية المتصلة بها (adminer)
services:
  db:
    image: postgres:17.6
    env_file:
      - .env
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

  adminer:
    image: adminer
    ports:
      - 8080:8080
    depends_on:
      - db

volumes:
  pgdata:

الآن قم بتشغيل الخدمات:

docker compose up

ثم ادخل على الرابط localhost:8080 وستجد واجهة رسومية تنفذ من خلالها لقاعدة البيانات. وأما بيانات الدخول فستجدها في ملف متغيرات البيئة .env الذي تم تعريفه مسبقًا.

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

ملخص

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

السؤال التالي: كيف أصل برمجية بايثون -مثلاً- بقاعدة البيانات حتى أستطيع استعلامها والتخزين فيها؟