اذهب إلى المحتوى

أوامر متقدمة في صدفة psql


Mostafa Ata العايش

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

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

أصناف أوامر psql

تنقسم أوامر psql إلى المجموعات التالية:

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

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

أوامر الاتصال

تُعتبر أوامر الاتصال من أهم أوامر صدفة psql، فهي التي تسمح بالاتصال بقاعدة بيانات معينة، أو استعراض المعلومات الخاصة بها.

استعراض معلومات الاتصال

يمكن استخدام الأمر '‎\conninfo' لاستعراض المعلومات الرئيسية للاتصال الحالي (اسم قاعدة البيانات، اسم المستخدم، رقم المنفذ للعملية postgres):

hsoubguide=# \conninfo

You are connected to database "hsoubguide" as user "postgres" via socket in "/var/run/postgresql" at port "5432".

الاتصال بقاعدة بيانات أخرى

إن لم تقم بالدخول إلى الصدفة محددًّا اسم قاعدة البيانات التي ترغب بالاتصال بها، فيمكنك الاتصال من داخل الصدفة بالأمر '‎\connect'

hsoubguide=# \connect postgres

You are now connected to database "postgres" as user "postgres".

postgres=# \connect hsoubguide
You are now connected to database "hsoubguide" as user "postgres".

أوامر استعراض أخرى مهمة

سنذكر فيما يلي كيفية استعراض التوابع في صدفة psql وكيفية استعراض الفهارس المخزنة في قاعدة البيانات، وقد ذكرنا العديد من أوامر الاستعراض في الفصل الرابع من هذا الدليل، استعرضنا فيها الجداول وقواعد البيانات، فيمكن الرجوع للفصل الرابع لأوامر الاستعراض الأساسية.

استعراض جميع التوابع المتاحة

يعرض الأمر '‎\df' قائمة بجميع التوابع التي يٌمكن استخدامها في الصدفة، مع نوع القيمة المعادة من كل تابع، ونوع الوسطاء الممررة لكل منهم:

hsoubguide=# \df

                                                   List of functions
 Schema |           Name           | Result data type |                   Argument data types                   | Type 
--------+--------------------------+------------------+---------------------------------------------------------+------
 public | akeys                    | text[]           | hstore                                                  | func
 public | avals                    | text[]           | hstore                                                  | func
 public | defined                  | boolean          | hstore, text                                            | func
 public | delete                   | hstore           | hstore, hstore                                          | func
 public | delete                   | hstore           | hstore, text                                            | func
 public | delete                   | hstore           | hstore, text[]                                          | func
 public | each                     | SETOF record     | hs hstore, OUT key text, OUT value text                 | func
 public | exist                    | boolean          | hstore, text                                            | func
 public | exists_all               | boolean          | hstore, text[]                                          | func
 public | exists_any               | boolean          | hstore, text[]                                          | func
 public | fetchval                 | text             | hstore, text                                            | func
...
...
(58 rows)

كما يمكن الحصول على المزيد من المعلومات التي تخص كل تابع بإضافة الرمز + في نهاية الأمر السابق.

استعراض الفهارس المخزنة في قاعدة البيانات

يعرض الأمر '‎\di' قائمة بأهم الفهارس (indexes) المخزنة في قاعدة البيانات، كما يمكن استخدام الرمز + لاستعراض معلومات إضافية، منها الحجم الذي تحجزه هذه الفهارس في الذاكرة.

hsoubguide=# \di+

                                        List of relations
 Schema |            Name            | Type  |  Owner   |    Table    |    Size    | Description 
--------+----------------------------+-------+----------+-------------+------------+-------------
 public | basket_a_pkey              | index | postgres | basket_a    | 16 kB      | 
 public | basket_b_pkey              | index | postgres | basket_b    | 16 kB      | 
 public | departments_department_key | index | postgres | departments | 16 kB      | 
 public | departments_pkey           | index | postgres | departments | 16 kB      | 
 public | employees_pkey             | index | postgres | employees   | 16 kB      | 
 public | marks_pkey                 | index | postgres | marks       | 16 kB      | 
 public | names_pkey                 | index | postgres | names       | 16 kB      | 
 public | phones_pkey                | index | postgres | phones      | 16 kB      | 
 public | products_pkey              | index | postgres | products    | 16 kB      | 
 public | purchases_pkey             | index | postgres | purchases   | 40 kB      | 
 public | student_pkey               | index | postgres | student     | 16 kB      | 
 public | table1_pkey                | index | postgres | table1      | 16 kB      | 
 public | table2_pkey                | index | postgres | table2      | 16 kB      | 
 public | test_table_pkey            | index | postgres | test_table  | 16 kB      | 
 public | users2_pkey                | index | postgres | users2      | 8192 bytes | 
 public | users_pkey                 | index | postgres | users       | 16 kB      | 
(16 rows)

أوامر التنسيق

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

تنسيق المحاذاة

يمكن استخدام الأمر '‎\a' لتشغيل محاذاة محتوى العمود مع اسمه، أو لإيقاف ذلك.

hsoubguide=# \a

Output format is unaligned.

hsoubguide=# SELECT * FROM products LIMIT 4;
id|title|price|created_at|deleted_at|tags
1|Dictionary|9.99|2011-01-01 22:00:00+02||{Book}
2|Python Book|29.99|2011-01-01 22:00:00+02||{Book,Programming,Python}
3|Ruby Book|27.99|2011-01-01 22:00:00+02||{Book,Programming,Ruby}
4|Baby Book|7.99|2011-01-01 22:00:00+02||{Book,Children,Baby}
(4 rows)

hsoubguide=# \a

Output format is aligned.

hsoubguide=# SELECT * FROM products LIMIT 4;
 id |    title    | price |       created_at       | deleted_at |           tags            
----+-------------+-------+------------------------+------------+---------------------------
  1 | Dictionary  |  9.99 | 2011-01-01 22:00:00+02 |            | {Book}
  2 | Python Book | 29.99 | 2011-01-01 22:00:00+02 |            | {Book,Programming,Python}
  3 | Ruby Book   | 27.99 | 2011-01-01 22:00:00+02 |            | {Book,Programming,Ruby}
  4 | Baby Book   |  7.99 | 2011-01-01 22:00:00+02 |            | {Book,Children,Baby}
(4 rows)

كما يمكنك تغيير المحرف الفاصل بين الأعمدة باستخدام الأمر '‎\f' مع تمرير المحرف المُراد، ويمكنك كذلك منع طباعة أسماء الأعمدة والاكتفاء بالمحتويات باستخدام الأمر '‎\t'.

تنسيق HTML

يمكنك استخدام الأمر '‎\H' لتغيير حالة المخرجات من النمط المكتوب إلى نمط HTML وبالعكس:

hsoubguide=# SELECT * FROM products LIMIT 4;

 id |    title    | price |       created_at       | deleted_at |           tags            
----+-------------+-------+------------------------+------------+---------------------------
  1 | Dictionary  |  9.99 | 2011-01-01 22:00:00+02 |            | {Book}
  2 | Python Book | 29.99 | 2011-01-01 22:00:00+02 |            | {Book,Programming,Python}
  3 | Ruby Book   | 27.99 | 2011-01-01 22:00:00+02 |            | {Book,Programming,Ruby}
  4 | Baby Book   |  7.99 | 2011-01-01 22:00:00+02 |            | {Book,Children,Baby}
(4 rows)
hsoubguide=# \H

Output format is html.
hsoubguide=# SELECT * FROM products LIMIT 4;

<table border="1">
  <tr>
    <th align="center">id</th>
    <th align="center">title</th>
    <th align="center">price</th>
    <th align="center">created_at</th>
    <th align="center">deleted_at</th>
    <th align="center">tags</th>
  </tr>
  <tr valign="top">
    <td align="right">1</td>
    <td align="left">Dictionary</td>
    <td align="right">9.99</td>
    <td align="left">2011-01-01 22:00:00+02</td>
    <td align="left">&nbsp; </td>
    <td align="left">{Book}</td>
  </tr>
  <tr valign="top">
    <td align="right">2</td>
    <td align="left">Python Book</td>
    <td align="right">29.99</td>
    <td align="left">2011-01-01 22:00:00+02</td>
    <td align="left">&nbsp; </td>
    <td align="left">{Book,Programming,Python}</td>
  </tr>
  <tr valign="top">
    <td align="right">3</td>
    <td align="left">Ruby Book</td>
    <td align="right">27.99</td>
    <td align="left">2011-01-01 22:00:00+02</td>
    <td align="left">&nbsp; </td>
    <td align="left">{Book,Programming,Ruby}</td>
  </tr>
  <tr valign="top">
    <td align="right">4</td>
    <td align="left">Baby Book</td>
    <td align="right">7.99</td>
    <td align="left">2011-01-01 22:00:00+02</td>
    <td align="left">&nbsp; </td>
    <td align="left">{Book,Children,Baby}</td>
  </tr>
</table>
<p>(4 rows)<br />
</p>
hsoubguide=# \H

Output format is aligned.

استعراض تاريخ الاستعلامات وحفظه

يمكن استعراض تاريخ الاستعلامات وأوامر الصدفة التي نُفّذت من قبل باستخدام الأمر ‎\s، كما يمكنك حفظ هذا السجل بإضافة اسم الملف الذي ترغب بحفظ السجل فيه.

hsoubguide=# \s /tmp/psql_history.txt

Wrote history to file "/tmp/psql_history.txt".

أوامر التعامل مع المتغيرات

تسمح psql بتعريف متغيرات داخلها، واستخدامها لاحقًا ضمن التعليمات أو الاستعلامات اللاحقة.

يمكن تعريف متغير باستخدام الأمر set\ كما يمكن حذفه باستخدام unset\، وفي حال أردنا استخدام قيمة هذا المتغير، علينا أن نضع قبل اسمه الرمز :.

hsoubguide=# \set NAME mostafa
hsoubguide=# \set rate 5.9

hsoubguide=# \echo :rate
5.9

hsoubguide=# \echo :NAME
mostafa
hsoubguide=# SELECT * FROM test_table WHERE number > :rate;

 id | number | name  
----+--------+-------
  4 |     22 | hel..
  1 |     10 | 10
  2 |     13 | 13
(3 rows)

كما يمكن استخدام الأمر prompt\ لطلب إدخال قيمة من المستخدم، وذلك بعد طباعة عبارة الطلب:

hsoubguide=# \prompt 'Please enter your name: ' NAME
Please enter your name: Mostafa

hsoubguide=# \echo :NAME
Mostafa

يمكنك استخدام قيم هذه المتغيرات ضمن الاستعلامات أو ضمن أوامر psql أخرى.

الأوامر الشرطية

بعد أن تعرفنا على الأوامر الخاصة بالمتغيرات، يجدر بنا أن نعرف أن psql تتيح استخدام التعليمات الشرطية if\ و elif\ و else\ للتحكم بكيفية سير التنفيذ، ويوضح المثال التالي المأخوذ من التوثيق كيفية استخدامها:

SELECT
    EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer,
    EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee
\gset
\if :is_customer
    SELECT * FROM customer WHERE customer_id = 123;
\elif :is_employee
    \echo 'is not a customer but is an employee'
    SELECT * FROM employee WHERE employee_id = 456;
\else
    \if yes
        \echo 'not a customer or employee'
    \else
        \echo 'this will never print'
    \endif
\endif

أوامر نظام التشغيل

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

تنفيذ أوامر صدفة bash ضمن psql

تسمح psql بتنفيذ أوامر صدفة bash بكتابتها بعد الأمر !\ كما يلي:

postgres=# \! echo Hello

Hello
postgres=# \! pwd

/usr/pgsql-12/bin

تشغيل توقيت الاستعلام

في الحالة الافتراضية لا يكون توقيت تنفيذ الاستعلام مُتاحًا للعرض، ولكن يمكننا تفعيله من خلال الأمر التالي:

hsoubguide=# SELECT * FROM products LIMIT 1;

 id |   title    | price |       created_at       | deleted_at |  tags  
----+------------+-------+------------------------+------------+--------
  1 | Dictionary |  9.99 | 2011-01-01 22:00:00+02 |            | {Book}
(1 row)

Time: 0.723 ms

حيث سيتيح ذلك الأمر إظهار توقيت الاستعلام بالميلي ثانية.

الخروج من صدفة postgres

قد تقضي وقتًا طويلًا داخل صدفة psql، ليس حبًّا بها، ولكن لعدم معرفة كيفية الخروج منها، لذلك لا تنسَ أن الأمر ‎\q هو الذي يُخرجك من صدفة psql.

hsoubguide=# \q

bash-4.2$ 

خلاصة

تعرفنا في هذا الفصل إلى جميع أنواع أوامر صدفة psql، وذكرنا أكثرها أهمية، بما يسمح لك بزيادة كفاءة تعاملك مع قواعد بيانات Postgres، وتذكر دومًا أنه يمكنك استعراض العديد من الأوامر الأخرى من خلال الأمر ‎\?‎.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...