IlmHamroh
JavaScript Full-stack/26-qism. SQL va PostgreSQL9/64-dars17 daqiqa
Mundarija (44)

psql chuqur: PostgreSQL terminal klientining meta-buyruqlari

Qisqacha: psql — PostgreSQL bilan birga keladigan terminal dasturi. Unda ikki xil buyruq bor: oddiy SQL (SELECT …;) serverga yuboriladi, \ bilan boshlanadigan meta-buyruqlar (\dt, \d jadval, \x, \timing) esa psql'ning o'zida bajariladi. Jadvallar tuzilmasini ko'rish, so'rov vaqtini o'lchash, natijani CSV'ga chiqarish va SQL skriptlarni ishga tushirish uchun psql eng tez vosita. Skriptlarda -v ON_ERROR_STOP=1 ni unutmang — usiz xatodan keyin ham psql davom etadi va muvaffaqiyat kodi (0) qaytaradi.

Bu darsda

  • psql'ga ulanib, bazalar, jadvallar va ustunlar ro'yxatini meta-buyruqlar bilan ko'rasiz.
  • Natijani vertikal ko'rinishda chiqarasiz, so'rov vaqtini o'lchaysiz, so'rovni har soniyada qaytarasiz.
  • psql o'zgaruvchilari (\set, \gset) va \echo bilan kichik hisobot skripti yozasiz.
  • \i, \copy va .psqlrc faylidan foydalanasiz.
  • psql -c, -f, -At, --csv va ON_ERROR_STOP bilan psql'ni skriptlarda to'g'ri ishlatasiz.

Oldin bilishingiz kerak: PostgreSQL o'rnatish va ulanish, Terminal, shell va prompt.

1. Nega bu kerak?

PostgreSQL o'rnatish va ulanish darsida bazani ko'tardingiz va bir-ikki buyruqni -c bilan yubordingiz. Endi kundalik ish boshlanadi: "bu jadvalda qanday ustunlar bor?", "bu so'rov necha millisekund ishlaydi?", "natijani Excel'ga olib bera olasizmi?".

Bularning hammasi uchun grafik dastur ochish shart emas. psql har qanday serverda bor — hatto grafik interfeys umuman yo'q Linux serverda ham. Kechasi soat 2 da production bazasida muammo chiqsa, sizda bitta SSH oynasi va psql bo'ladi. Shuning uchun tajribali backend dasturchilar va baza administratorlari psql'ni yaxshi bilishadi.

Hayotiy o'xshatish: telefon raqamini terish va telefonning o'z sozlamalari. Raqamni tersangiz — qo'ng'iroq boshqa odamga ketadi (SQL serverga). Sozlamalar menyusida esa telefonning o'zi bilan gaplashasiz: ovoz balandligi, ekran yorqinligi (meta-buyruqlar psql'ning o'ziga).

2. psql bilan tanishuv

2.1 Ulanish va taklif belgisi

Konteyner ichidagi psql bilan ulanish (parol so'ramaydi — konteyner ichidan trust):

bash
docker exec -it kanon26-pg psql -U postgres -d vazifalar

-it — interaktiv rejim (klaviaturadan yozasiz). Ulangandan keyin psql taklif belgisini (prompt) ko'rsatadi:

text
vazifalar=#

vazifalar — joriy baza, =# — siz superuser (bosh foydalanuvchi). Oddiy foydalanuvchida => bo'ladi. Buyruq bir necha qatorga cho'zilsa, taklif vazifalar-# ga o'zgaradi — psql "davomini kutyapman" demoqda.

2.2 Ikki xil buyruq

flowchart LR
  F[Siz yozasiz] --> Q{Boshida \ bormi?}
  Q -- ha --> M[psql o'zi bajaradi<br/>\dt, \x, \timing]
  Q -- yo'q --> S[Serverga yuboriladi<br/>SELECT ...;]
  M -. ichida SQL ham .-> S

Nimaga qarang: meta-buyruqlar psql'da qoladi. Lekin ularning ko'pi ichkarida o'zi SQL so'rov yuboradi — masalan \dt serverdan katalog jadvallarini so'raydi. Nuqtali chiziq shuni ko'rsatadi.

Ikki muhim farq:

SQL buyruq Meta-buyruq
Boshlanishi so'z bilan (SELECT) \ bilan
Tugashi ; bilan qator oxiri bilan
Kim bajaradi server psql

SQL buyruq ; siz yuborilmaydi — psql davomini kutadi. Bu boshlovchilarning eng ko'p qoqiladigan joyi: Enter bosdingiz, hech narsa bo'lmadi, taklif vazifalar-# bo'ldi. Sabab — ; yo'q.

2.3 Yordam va chiqish

  • \? — hamma meta-buyruqlar ro'yxati.
  • \h CREATE TABLE — SQL buyrug'ining sintaksisi (Postgres hujjatidan qisqa ma'lumot).
  • \q — psql'dan chiqish (Ctrl+D ham ishlaydi).

\? variables — psql'ning maxsus o'zgaruvchilari ro'yxati. Kanon chiqishining boshi:

text
List of specially treated variables

psql variables:
Usage:
  psql --set=NAME=VALUE
  or \set NAME VALUE inside psql

3. Bazada yo'l topish

Bu bo'limdagi chiqishlar — kanon tajriba bazasida psql 18.6 bilan olingan (konteyner ichida). Avval kichik jadval yaratildi: t09_mahsulot (id, nom, narx) — «Bahor» menyusi: osh, lag'mon, manti, ko'k choy.

3.1 \conninfo, \l, \c

\conninfo — "men hozir qayerga, kim bo'lib ulanganman?". psql 18 da u jadval ko'rinishida chiqadi (kanon chiqishidan bir qismi):

text
      Parameter       |        Value
----------------------+---------------------
 Database             | tajriba
 Client User          | postgres
 Socket Directory     | /var/run/postgresql
 Server Port          | 5432
 SSL Connection       | false
 Superuser            | on

Biz o'z nusxamizdagi psql 17.6 da sinadik — u eski uslubda bitta qator chiqaradi: You are connected to database "v12" as user "postgres" on host "127.0.0.1" at port "5511". Ma'nosi bir xil.

\l — serverdagi hamma bazalar (kanonda: postgres, tajriba, template0, template1, vazifalar). template0 va template1 — yangi baza yaratilganda nusxa olinadigan shablonlar, ularga tegmang.

\c baza — boshqa bazaga o'tish:

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

(Bu xabarni o'z nusxamizda oldik.)

3.2 \dt va \d

\dt — joriy bazadagi jadvallar:

text
              List of tables
 Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------
 public | t07_hisob    | table | postgres
 public | t09_mahsulot | table | postgres
(2 rows)

\d jadval — jadval tuzilmasi. Bu buyruqni eng ko'p ishlatasiz:

text
                         Table "public.t09_mahsulot"
 Column |     Type      | Collation | Nullable |           Default
--------+---------------+-----------+----------+------------------------------
 id     | integer       |           | not null | generated always as identity
 nom    | text          |           | not null |
 narx   | numeric(12,2) |           |          |
Indexes:
    "t09_mahsulot_pkey" PRIMARY KEY, btree (id)

Ustunlar, turlari, not null, sukut qiymatlar va indekslar bir qarashda. Relatsion model darsida information_schema dan so'raganimiz ham shu ma'lumot — \d uni o'zi so'rab, chiroyli chiqaradi.

3.3 + — batafsilroq

Ko'p meta-buyruqning + li varianti bor. \d+ t09_mahsulot qo'shimcha ustunlar (Storage, Description) va bo'limlar chiqaradi. Kanon chiqishining oxiri:

text
Not-null constraints:
    "t09_mahsulot_id_not_null" NOT NULL "id"
    "t09_mahsulot_nom_not_null" NOT NULL "nom"
Access method: heap

Not-null constraints bo'limi — PostgreSQL 18 yangiligi: endi NOT NULL ham nomli cheklov sifatida saqlanadi. Eski versiyalarda bu bo'lim yo'q. \dt+ esa jadvallar hajmini ham ko'rsatadi — "qaysi jadval eng katta?" savolida foydali.

3.4 Boshqa ro'yxatlar

Buyruq Nima ko'rsatadi Kanonda
\dn sxemalar (namespace) public
\du rollar (foydalanuvchilar) postgres — Superuser …
\dx o'rnatilgan kengaytmalar plpgsql
\df funksiyalar \df+ pg_catalog.lower — 3 ta
\di indekslar —
\dv ko'rinishlar (view) —

Naqshni payqadingizmi? \d + harf: t — table, n — namespace, u — user, x — extension, f — function, i — index, v — view. Ko'pi naqsh qabul qiladi: \dt vazifa* — vazifa bilan boshlanadigan jadvallar.

Tekshirib ko'ring: vazifalar bazasidagi foydalanuvchilar jadvalining ustunlarini va indekslarini ko'rish uchun qaysi buyruqni yozasiz? Oxiriga ; kerakmi?

Javob

\d foydalanuvchilar. ; kerak emas — meta-buyruq qator oxirida tugaydi. ; qo'ysangiz ham psql uni ko'pincha e'tiborsiz qoldiradi, lekin odat sifatida meta-buyruqqa ; qo'ymang. Boshqa bazadagi jadval bo'lsa — avval \c vazifalar.

4. Natijani ko'rish

4.1 \x va \gx — vertikal ko'rinish

Ustunlar ko'p bo'lsa, qator ekranga sig'maydi va o'qib bo'lmaydi. \x on — kengaytirilgan ko'rinish: har ustun alohida qatorda:

text
-[ RECORD 1 ]--
id   | 1
nom  | Osh
narx | 35000.00

\x off — odatiy holatga qaytish. \x auto — psql o'zi tanlaydi: sig'masa vertikal. Faqat bitta so'rov uchun kerak bo'lsa — ; o'rniga \gx yozing:

sql
SELECT * FROM t09_mahsulot WHERE id = 2 \gx

Natija:

text
-[ RECORD 1 ]--
id   | 2
nom  | Lag'mon
narx | 28000.00

4.2 \pset null — NULL'ni ko'rinadigan qilish

Sukut bo'yicha psql NULL ni bo'sh joy qilib ko'rsatadi. Bo'sh satr ('') ham bo'sh ko'rinadi. Ikkalasini ajratish uchun:

text
\pset null '(null)'

Endi NULL o'rnida (null) chiqadi. Buni .psqlrc ga qo'yish foydali — pastda ko'ramiz.

4.3 \timing — so'rov vaqti

sql
\timing on
SELECT count(*) FROM generate_series(1, 1000000);

Kanon chiqishi:

text
  count
---------
 1000000
(1 row)

Time: 222.952 ms

generate_series(1, 1000000) — 1 dan 1 000 000 gacha sonlar. Ularni sanash kanon mashinasida (i5-12500H, Docker Desktop) 223 ms oldi. Sizda boshqa raqam chiqadi — vaqt mashinaga, yuklamaga va keshga bog'liq. \timing — "qaysi so'rov sekin?" savoliga birinchi qadam. Chuqur tahlil — EXPLAIN ANALYZE'ni o'qish darsida.

4.4 \watch — har soniyada qaytarish

So'rov oxiriga \watch qo'ysangiz, psql uni qayta-qayta bajaradi. i=1 — har 1 soniyada, c=2 — 2 marta (bu parametrlar psql 16 dan beri bor):

sql
SELECT count(*) AS soni FROM t09_mahsulot \watch i=1 c=2

Kanon chiqishi:

text
Sat 24 Oct 2026 04:55:04 AM UTC (every 1s)

 soni
------
    5
(1 row)

Sat 24 Oct 2026 04:55:05 AM UTC (every 1s)

 soni
------
    5
(1 row)

c siz \watch Ctrl+C bosilguncha davom etadi. Foydali holat: import jarayonida "jadvalda nechta qator bo'ldi?" ni kuzatish.

5. psql o'zgaruvchilari

5.1 \set va \echo

psql'ning o'z o'zgaruvchilari bor. \set nom qiymat — yaratadi, :nom — ishlatadi, \echo — matn chiqaradi:

text
\set egasi 2
SELECT matn FROM vazifalar WHERE egasi_id = :egasi;

psql so'rovni serverga yuborishdan oldin :egasi ni 2 ga almashtiradi. Matn qiymat kerak bo'lsa — :'nom' (qo'shtirnoqqa o'raydi va ichidagi belgilarni xavfsiz qiladi), identifikator (jadval nomi) — :"nom".

5.2 \gset — natijani o'zgaruvchiga

\gset so'rov natijasidagi har ustunni shu nomli o'zgaruvchiga yozadi:

sql
SELECT max(narx) AS eng_qimmat FROM t09_mahsulot \gset

Endi :eng_qimmat = 35000.00. Uni \echo bilan chiqaramiz.

5.3 Apostrof tuzog'i

Kanon shunday yozdi:

text
\echo Eng qimmat taom: :eng_qimmat so'm

Natija:

text
Eng qimmat taom: 35000.00psql:<stdin>:24: error: unterminated quoted string

Tarjimasi: "yopilmagan qo'shtirnoqli satr". psql meta-buyruqlarda ' ni satr boshlanishi deb tushunadi. so'm dagi apostrof "satr ochdi", lekin uni hech kim yopmadi. O'zbekcha matnda bu tuzoq tez-tez uchraydi: so'm, bo'ldi, o'qish.

Tuzatish — matnni o'zi qo'shtirnoqqa olish, ichidagi apostrofni ikkilantirish (SQL'dagi qoida bilan bir xil):

text
\echo 'Eng qimmat taom:' :eng_qimmat 'so''m'

Biz o'z nusxamizda (psql 17.6) sinadik:

text
Eng qimmat taom: 35000.00 so'm

Tekshirib ko'ring: \set ism 'Ali' dan keyin SELECT * FROM foydalanuvchilar WHERE ism = :ism; nima bo'ladi? :'ism' bilan-chi?

Javob

:ism shundayligicha Ali ga almashadi: WHERE ism = Ali — Postgres Ali ni ustun nomi deb o'qiydi va column "ali" does not exist xatosini beradi. :'ism' esa 'Ali' ga almashadi — to'g'ri matn qiymati. Qoida: son — :nom, matn — :'nom', jadval yoki ustun nomi — :"nom".

6. Fayllar bilan ishlash

6.1 \i — SQL faylni bajarish

\i fayl.sql — fayldagi hamma buyruqlarni xuddi klaviaturadan yozgandek bajaradi. Kanon t09-qosh.sql faylini bajardi (unda bitta INSERT va bitta SELECT):

text
INSERT 0 1
    nom    |   narx
-----------+----------
 Osh       | 35000.00
 Manti     | 30000.00
 Lag'mon   | 28000.00
 Somsa     |  8000.00
 Ko'k choy |  5000.00
(5 rows)

Menyuga somsa qo'shildi. Sxema fayllari, namuna ma'lumotlar, migratsiyalar — hammasi shunday ishga tushiriladi. Kanon vazifalar sxemasini ham har faylni psql bilan bajarib quradi.

6.2 \copy va COPY farqi

Jadvalni CSV faylga chiqarish:

text
\copy t09_mahsulot TO '/tmp/t09-menyu.csv' WITH (FORMAT csv, HEADER)

Javob COPY 5 — 5 qator yozildi. Fayl ichi:

text
id,nom,narx
1,Osh,35000.00
2,Lag'mon,28000.00
3,Manti,30000.00
4,Ko'k choy,5000.00
5,Somsa,8000.00

Shunga o'xshash SQL buyruq ham bor — COPY (backslash'siz). Farqi juda muhim:

\copy (psql) COPY (SQL)
Fayl qayerda psql ishlayotgan kompyuterda server diskida
Kim o'qiydi/yozadi psql server jarayoni
Huquq oddiy foydalanuvchi superuser yoki maxsus rol

Postgres Docker'da yoki boshqa serverda ishlasa, COPY … TO '/tmp/x.csv' faylni server ichiga yozadi — sizning kompyuteringizda u paydo bo'lmaydi. O'z kompyuteringizdagi faylga — \copy. Kanon bu tajribada psql'ni konteyner ichida ishlatgan, shuning uchun ikkala fayl ham konteynerda bo'lardi. COPY ning huquq talabi — postgresql.org/docs/18 hujjati bo'yicha. Katta hajmdagi COPY ni Ommaviy ma'lumot: COPY, batch va cursor darsida Node.js bilan o'lchaymiz.

6.3 \! va \e

  • \! buyruq — psql'dan chiqmasdan terminal buyrug'ini bajarish. Kanon \! cat /tmp/t09-menyu.csv bilan faylni ko'rdi (yuqoridagi chiqish).
  • \e — oxirgi so'rovni matn muharririda ochadi; saqlab yopsangiz, so'rov bajariladi. Muharrir EDITOR yoki PSQL_EDITOR muhit o'zgaruvchisidan olinadi. Bu interaktiv buyruq — kanon uni sinamagan, hujjat bo'yicha aytyapmiz.

7. .psqlrc — o'z sozlamalaringiz

psql har ishga tushganda uy papkangizdagi .psqlrc faylini o'qiydi (Windows'da %APPDATA%\postgresql\psqlrc.conf). Unga har safar kerak bo'ladigan sozlamalarni yozasiz. Kanon fayli:

text
\set QUIET 1
\pset null '(null)'
\timing on
\set QUIET 0

QUIET — sozlash paytida "Timing is on." kabi xabarlarni yashiradi. Kanon uchta holatni solishtirdi (PSQLRC muhit o'zgaruvchisi bilan vaqtinchalik fayl):

Buyruq NULL Time: qatori
.psqlrc siz bo'sh yo'q
.psqlrc bilan, -c (null) Time: 0.466 ms
.psqlrc bilan, -X -c bo'sh yo'q

Muhim topilma: .psqlrc faqat interaktiv rejimda emas, -c va -f da ham o'qiladi. Skriptlarda bu xavfli — sizning \timing ingiz skript chiqishini o'zgartiradi. Shuning uchun skriptlarda doim -X (.psqlrc ni o'qima) qo'ying. Kanonning hamma skriptlari psql -X bilan ishlaydi.

8. psql skriptlarda

8.1 -c, -f, -At, --csv

Bayroq Ma'nosi
-c "SQL" bitta buyruqni bajarib chiqish
-f fayl.sql faylni bajarish
-A tekislashsiz (ustunlar `
-t sarlavha va (N rows) siz
--csv CSV formatda
-X .psqlrc ni o'qimaslik

-At — skriptlar uchun eng qulay: faqat qiymatlar, ortiqcha bezaksiz:

bash
psql -U postgres -d vazifalar -At \
  -c "select ism, email from foydalanuvchilar order by id limit 3"

Kanon chiqishi:

text
Aziz Karimov|aziz@example.com
Dilnoza Rahimova|dilnoza@example.com
Sardor Tursunov|sardor@example.com

--csv bilan xuddi shu so'rov sarlavhali CSV beradi (ism,email qatori bilan) — uni Excel yoki Google Sheets to'g'ridan-to'g'ri ochadi.

8.2 -v va -c tuzog'i

-v nom=qiymat — psql o'zgaruvchisini buyruq qatoridan berish. Lekin kanon kutilmagan natija oldi:

bash
psql -U postgres -d vazifalar -v email=dilnoza@example.com \
  -c "select ism from foydalanuvchilar where email = :'email'"
text
ERROR:  syntax error at or near ":"
LINE 1: select ism from foydalanuvchilar where email = :'email'
                                                       ^

Tarjimasi: ": yonida sintaksis xatosi". -c ga berilgan matnda psql o'zgaruvchilarni almashtirmaydi — :'email' serverga shundayligicha ketdi. Xuddi shu so'rov faylda (-f yoki < orqali) ishladi va Dilnoza Rahimova ni qaytardi. Qoida: o'zgaruvchili so'rov — faylda.

8.3 ON_ERROR_STOP

Skript o'rtasida xato bo'lsa nima bo'ladi? Kanon ikki holatni sinadi. ON_ERROR_STOP siz:

bash
psql -U postgres -d vazifalar \
  -c "select 1/0" -c "select 'ON_ERROR_STOP siz davom etdi'"
text
ERROR:  division by zero
           ?column?
------------------------------
 ON_ERROR_STOP siz davom etdi
(1 row)

[exit 0]

Xato bo'ldi, lekin psql keyingi buyruqni bajardi va exit kod 0 ("hammasi yaxshi") bilan tugadi. Exit kodlarni process obyekti: argv, env, exit kodlari va signallar darsida o'rgangansiz: CI yoki deploy skripti 0 ni ko'rib, "sxema qo'llandi" deb davom etadi — vaholanki yarmi qo'llanmagan.

-v ON_ERROR_STOP=1 bilan:

text
ERROR:  division by zero
[exit 1]

Birinchi xatoda to'xtadi, ikkinchi buyruq bajarilmadi, exit kod 1. Sxema fayllarini qo'llashda kanon yana -1 ni ham qo'shadi — butun fayl bitta tranzaksiyada: yo hammasi, yo hech narsa (ACID, BASE, CAP va PACELC darsidagi atomicity).

bash
psql -X -1 -v ON_ERROR_STOP=1 -d vazifalar -f 001-jadvallar.sql

9. SQL qadami: o'z psql muhitingiz

Bu darsda vazifalar sxemasiga o'zgarish yo'q. Lekin keyingi 30 dars davomida ishlatadigan muhitni tayyorlaymiz:

  1. Uy papkangizda .psqlrc yarating (Windows'da %APPDATA%\postgresql\psqlrc.conf): \pset null '(null)', \timing on, \x auto.
  2. vazifalar bazasiga ulaning va \dt qiling — hozircha Did not find any relations. ("hech qanday jadval topilmadi") chiqadi.
  3. Loyiha papkasida sql/ papkasini oching — keyingi darsdan boshlab sxema fayllari shu yerda bo'ladi va psql -X -1 -v ON_ERROR_STOP=1 -f bilan qo'llanadi.

Birinchi fayl — sql/001-jadvallar.sql — CREATE TABLE va cheklovlar darsida.

10. Ko'p uchraydigan xatolar

10.1 ; unutildi

Enter bosildi, hech narsa bo'lmadi, taklif =# dan -# ga o'zgardi. psql davomini kutyapti. ; yozib Enter bosing. Bekor qilish kerak bo'lsa — \r (bufer tozalanadi) yoki Ctrl+C.

10.2 Meta-buyruqda apostrof

unterminated quoted string — \echo yoki boshqa meta-buyruq matnida ' bor. Matnni '…' ga oling, ichidagi apostrofni '' qiling.

10.3 Skriptda xato "yutildi"

ON_ERROR_STOP siz skript xatodan keyin ham davom etadi va 0 qaytaradi. Har skriptda: psql -X -v ON_ERROR_STOP=1.

10.4 COPY fayli "yo'qoldi"

COPY … TO '/tmp/x.csv' ishladi, lekin kompyuteringizda fayl yo'q. Fayl server (konteyner) ichida. Klient tomoniga — \copy.

10.5 -c da o'zgaruvchi

syntax error at or near ":" — -c matnida :nom almashtirilmaydi. So'rovni faylga oling.

11. Mashqlar

Mashqlar kurs/mashqlar/26/09-psql/ da.

1-mashq (oson): buyruqni toping

  1. Serverdagi bazalar ro'yxati — .
  2. Boshqa bazaga o'tish — .
  3. Jadval tuzilmasi — .
  4. So'rov vaqtini ko'rsatish — \timing .
  5. Bitta so'rov natijasini vertikal chiqarish (; o'rniga) — .
  6. psql'dan chiqish — .
Yechim

\l, \c baza, \d jadval (batafsil — \d+), \timing on, \gx, \q. Esda qolishi uchun: \d + harf — "describe" (tavsifla): \dt jadvallar, \du rollar, \dx kengaytmalar.

2-mashq (o'rta): natijani oldindan ayting

skript.sql faylida:

sql
SELECT 'birinchi' AS qadam;
SELECT 1/0;
SELECT 'uchinchi' AS qadam;

Ikki buyruq ishga tushirildi: (a) psql -X -d vazifalar -f skript.sql, (b) psql -X -v ON_ERROR_STOP=1 -d vazifalar -f skript.sql. Har birida nechta natija jadvali chiqadi va exit kod qanday?

Yechim

(a) Ikki jadval (birinchi va uchinchi), o'rtada ERROR: division by zero, exit kod 0. (b) Bitta jadval (birinchi), keyin xato, uchinchi bajarilmaydi, exit kod 3. -f bilan ishlaganda psql skript xatosi uchun 3 qaytaradi — -c dagi 1 dan farqli (psql hujjatidagi "Exit Status" bo'limi). Muhimi: ikkinchi holatda kod 0 emas, CI xatoni ko'radi.

3-mashq (qiyin): hisobot skripti

vazifalar bazasi (namuna ma'lumoti bilan, INSERT va RETURNING darsidan keyingi holat) uchun psql skripti yozing. U egasi o'zgaruvchisini qabul qilsin (-v egasi=2; berilmasa — 2) va chiqarsin:

  1. Hisobot: <ism>
  2. Bajarilgan: <son> / <jami>
  3. Bajarilmagan vazifalar ro'yxati CSV formatda (id,matn).

Ishoralar: \gset («\gset — natijani o'zgaruvchiga» bo'limi), \echo va apostrof qoidasi, \pset format csv. "Berilmagan bo'lsa" uchun psql'ning \if :{?egasi} (o'zgaruvchi bormi?) shartini ishlating — u \else va \endif bilan yopiladi. count(*) — qatorlar soni (Agregatlar, GROUP BY va HAVING darsida to'liq).

Yechim
sql
\if :{?egasi}
\else
  \set egasi 2
\endif
SELECT ism AS egasi_ism FROM foydalanuvchilar WHERE id = :egasi \gset
SELECT count(*) AS jami FROM vazifalar WHERE egasi_id = :egasi \gset
SELECT count(*) AS bajarilgan FROM vazifalar
WHERE egasi_id = :egasi AND bajarildi \gset
\echo 'Hisobot:' :egasi_ism
\echo 'Bajarilgan:' :bajarilgan '/' :jami
\echo 'Qolgan vazifalar (CSV):'
\pset format csv
SELECT id, matn FROM vazifalar
WHERE egasi_id = :egasi AND NOT bajarildi
ORDER BY id;

psql -X -q -d vazifalar -f 3-yechim.sql — biz ishga tushirgan natija (PostgreSQL 17.6, kanon namunasi):

text
Hisobot: Dilnoza Rahimova
Bajarilgan: 3 / 6
Qolgan vazifalar (CSV):
id,matn
14,IELTS writing task 2 mashqi #ingliz
26,Dugonamning tug'ilgan kuniga sovg'a #oila
36,Rezyume yangilash #ish

-q (quiet) — \pset ning "Output format is csv." xabarini yashiradi. Sonli o'zgaruvchi :egasi qo'shtirnoqsiz, chunki id — son.

4-mashq: SQL qadami

«SQL qadami» bo'limidagi .psqlrc ni yarating va tekshiring: SELECT NULL AS bosh; natijasida (null) va Time: qatori chiqishi kerak. Keyin xuddi shu so'rovni psql -X -c bilan bajaring — farqini yozing.

Yechim

.psqlrc bilan: bosh ustunida (null), pastda Time: … ms. -X bilan: ustun bo'sh, Time: yo'q — fayl o'qilmadi. Bu kanondagi «.psqlrc — o'z sozlamalaringiz» jadvali bilan bir xil. Xulosa: interaktiv ishda .psqlrc qulay, skriptda esa -X majburiy.

12. Real ishda

  • Production'da: serverga SSH bilan kirib, psql orqali holatni tekshirish — DevOps va backend dasturchining kundalik ishi. \dt+ (jadval hajmlari), \x (keng qatorlar), \timing eng ko'p ishlatiladi.
  • CI va deploy: migratsiya va namuna fayllar psql -X -1 -v ON_ERROR_STOP=1 -f bilan qo'llanadi. ORM'larning migratsiya vositalari ham ichkarida xuddi shunday ishlaydi (27-qismda).
  • Hisobot: menejer "shu oydagi foydalanuvchilar ro'yxatini Excel'da bering" dedi — psql --csv -c "…" > hisobot.csv.
  • Intervyu savoli: "Jadval tuzilmasini qanday ko'rasiz?", "COPY va \copy farqi?". Kuchli javobda "fayl qaysi kompyuterda" degan farq bor.

Xulosa

  • psql'da SQL (; bilan, serverga) va meta-buyruqlar (\ bilan, psql'ning o'ziga) bor.
  • Yo'l topish: \l, \c, \dt, \d, \d+ (PG 18 da Not-null constraints bo'limi), \dn, \du, \dx, \df.
  • Ko'rish: \x/\gx, \pset null, \timing, \watch i=1 c=2.
  • O'zgaruvchilar: \set, \gset, :nom/:'nom'; meta-buyruqdagi apostrof — unterminated quoted string.
  • \copy — klient fayli, COPY — server fayli; .psqlrc -c/-f da ham o'qiladi, skriptda -X.
  • Skriptda -v ON_ERROR_STOP=1 — usiz xatodan keyin davom etadi va 0 qaytaradi; -c da o'zgaruvchi almashtirilmaydi.

Keyingi dars: SQL tili va buyruq turlari — SQL qanday tuzilgan, buyruqlar qaysi guruhlarga bo'linadi va so'rov qaysi tartibda bajariladi.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
psql chuqur: PostgreSQL terminal klientining meta-buyruqlari — IlmHamroh