خطوة 7: إعداد قاعدة بيانات

5.0 version
Maintained

إعداد قاعدة بيانات

يدور موقع سجل زوار المؤتمر حول جمع التعليقات أثناء المؤتمرات. نحتاج إلى تخزين التعليقات التي ساهم بها حضور المؤتمر في مخزن دائم.

يتم وصف التعليق بشكل أفضل من خلال بنية بيانات ثابتة: المؤلف ، بريده الإلكتروني ، نص الملاحظات ، وصورة اختيارية. نوع البيانات التي يمكن تخزينها بشكل أفضل في محرك قاعدة بيانات علائقية تقليدي.

PostgreSQL هو محرك قاعدة البيانات الذي سنستعمل.

إضافة PostgreSQL إلى Docker Compose

على الجهاز المحلي لدينا ، قررنا استخدام Docker لإدارة الخدمات. قم بإنشاء ملف docker-compose.yaml وإضافة PostgreSQL كخدمة:

docker-compose.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
version: '3'

services:
    database:
        image: postgres:11-alpine
        environment:
            POSTGRES_USER: main
            POSTGRES_PASSWORD: main
            POSTGRES_DB: main
        ports: [5432]

سيؤدي هذا إلى تثبيت خادم PostgreSQL في الإصدار 11 وتكوين بعض متغيرات البيئة التي تتحكم في اسم قاعدة البيانات وبيانات الاعتماد. القيم لا تهم حقا.

نكشف أيضًا منفذ PostgreSQL (`` 5432``) من الحاوية container إلى المضيف المحلي. سيساعدنا ذلك في الوصول إلى قاعدة البيانات من الجهاز الخاص بنا.

Note

يجب أن يكون قد تم تثبيت ملحق pdo_pgsql` عندما تم إعداد PHP في خطوة سابقة.

بدء Docker Compose

بدء Docker Compose في الخلفية (`` -d``):

1
$ docker-compose up -d

انتظر قليلاً للسماح بتشغيل قاعدة البيانات والتحقق من أن كل شيء يسير على ما يرام:

1
2
3
4
5
$ docker-compose ps

        Name                      Command              State            Ports
---------------------------------------------------------------------------------------
guestbook_database_1   docker-entrypoint.sh postgres   Up      0.0.0.0:32780->5432/tcp

إذا لم تكن هناك حاويات قيد التشغيل أو إذا كان عمود State لا يقرأ Up ، فتحقق من سجلات Docker Compose:

1
$ docker-compose logs

الوصول إلى قاعدة البيانات المحلية

قد يكون استخدام الأداة المساعدة لسطر الأوامر psql مفيدًا من وقت لآخر. ولكن عليك أن تتذكر بيانات الاعتماد واسم قاعدة البيانات. أقل وضوحا ، تحتاج أيضا إلى معرفة المنفذ المحلي الذي تديره قاعدة البيانات على المضيف. يختار Docker منفذًا عشوائيًا حتى تتمكن من العمل على أكثر من مشروع باستخدام PostgreSQL في نفس الوقت (المنفذ المحلي هو جزء من مخرجات docker-compose ps).

إذا قمت بتشغيل psql عبر Symfony CLI ، فلن تحتاج إلى تذكر أي شيء.

يقوم Symfony CLI بالكشف تلقائيًا عن خدمات Docker التي يتم تشغيلها للمشروع ويكشف متغيرات البيئة التي يحتاجها psql للاتصال بقاعدة البيانات.

بفضل هذه الاتفاقيات، أصبح الوصول إلى قاعدة البيانات عبر symfony run أسهل كثيرًا:

1
$ symfony run psql

Note

إذا لم يكن لديك مشغل psql الثنائي على مضيفك المحلي ، يمكنك أيضًا تشغيله عبر docker:

1
$ docker exec -it guestbook_database_1 psql -U main -W main

إضافة PostgreSQL إلى SymfonyCloud

بالنسبة للبنية التحتية للإنتاج على SymfonyCloud ، يجب إضافة خدمة مثل PostgreSQL في ملف .symfony/services.yaml الفارغ حاليا:

.symfony/services.yaml
1
2
3
4
db:
    type: postgresql:11
    disk: 1024
    size: S

خدمة db هي قاعدة بيانات PostgreSQL في الإصدار 11 (مثل Docker) التي نريد توفيرها في حاوية صغيرة بسعة 1 جيجابايت من القرص.

نحتاج أيضًا إلى "ربط" قاعدة البيانات بحاوية التطبيق الموضحة في .symfony.cloud.yaml:

.symfony.cloud.yaml
1
2
relationships:
    database: "db:postgresql"

تتم الإشارة إلى خدمة db من النوع postgresql على أنها database في حاوية التطبيق.

الخطوة الأخيرة هي إضافة ملحق pdo_pgsql إلى وقت تشغيل PHP:

.symfony.cloud.yaml
1
2
3
4
runtime:
    extensions:
        - pdo_pgsql
        # other extensions here

ها هو الفرق الكامل لتغييرات .symfony.cloud.yaml:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
--- a/.symfony.cloud.yaml
+++ b/.symfony.cloud.yaml
@@ -4,6 +4,7 @@ type: php:7.3

 runtime:
     extensions:
+        - pdo_pgsql
         - apcu
         - mbstring
         - sodium
@@ -12,6 +13,9 @@ runtime:
 build:
     flavor: none

+relationships:
+    database: "db:postgresql"
+
 web:
     locations:
         "/":

قم بتنفيذ هذه التغييرات ثم أعد النشر إلى SymfonyCloud:

1
2
3
$ git add .
$ git commit -m'Configuring the database'
$ symfony deploy

الوصول إلى قاعدة بيانات SymfonyCloud

يعمل PostgreSQL الآن محليًا عبر Docker وفي الإنتاج على SymfonyCloud.

كما رأينا للتو ، فإن تشغيل symfony run psql يتصل تلقائيًا بقاعدة البيانات التي يستضيفها Docker بفضل متغيرات البيئة المتاحة بواسطة symfony run.

إذا كنت ترغب في الاتصال بـ PostgreSQL المستضافة على حاويات الإنتاج ، يمكنك فتح نفق SSH بين الجهاز المحلي والبنية الأساسية لــ SymfonyCloud:

1
$ symfony tunnel:open --expose-env-vars

بشكل افتراضي ، لا يتم كشف خدمات SymfonyCloud كمتغيرات بيئة على الجهاز المحلي. يجب عليك القيام بذلك بشكل صريح باستخدام علامة --expose-env-vars. لماذا ؟ الاتصال بقاعدة بيانات الإنتاج عملية خطيرة. يمكنك العبث مع بيانات حقيقية. الزامية طلب العلامة هو ما يؤكد أن هذا بالفعل ما تريد القيام به.

الآن ، قم بالاتصال بقاعدة بيانات PostgreSQL عن بعد من خلال symfony run psql كما كان من قبل:

1
$ symfony run psql

عند الانتهاء ، لا تنس إغلاق النفق:

1
$ symfony tunnel:close

Tip

لتشغيل بعض استعلامات SQL في قاعدة بيانات الإنتاج بدلاً من الحصول على محث الأوامر ، يمكنك أيضًا استخدام أمر``symfony sql``.

فضح متغيرات البيئة

يعمل Docker Compose و SymfonyCloud بسلاسة مع Symfony بفضل متغيرات البيئة.

تحقق من كل متغيرات البيئة المكشوفة بواسطة symfony عن طريق تنفيذ symfony var:export:

1
2
3
4
5
6
7
8
$ symfony var:export

PGHOST=127.0.0.1
PGPORT=32781
PGDATABASE=main
PGUSER=main
PGPASSWORD=main
# ...

تتم قراءة متغيرات البيئة PG* بواسطة الأداة المساعدة psql. ماذا عن الآخرين؟

عندما يكون النفق مفتوحًا لـ SymfonyCloud مع مجموعة العلامة --expose-env-vars، فإن الأمر var:export يُرجع متغيرات البيئة البعيدة:

1
2
3
$ symfony tunnel:open --expose-env-vars
$ symfony var:export
$ symfony tunnel:close

  • « Previous خطوة 6: إنشاء وحدة تحكم
  • Next » خطوة 8: وصف هيكل البيانات

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.