Mundarija (44)
- Bu darsda
- 1. Nega bu kerak?
- 2. psql bilan tanishuv
- 2.1 Ulanish va taklif belgisi
- 2.2 Ikki xil buyruq
- 2.3 Yordam va chiqish
- 3. Bazada yo'l topish
- 3.1 \conninfo, \l, \c
- 3.2 \dt va \d
- 3.3 + — batafsilroq
- 3.4 Boshqa ro'yxatlar
- 4. Natijani ko'rish
- 4.1 \x va \gx — vertikal ko'rinish
- 4.2 \pset null — NULL'ni ko'rinadigan qilish
- 4.3 \timing — so'rov vaqti
- 4.4 \watch — har soniyada qaytarish
- 5. psql o'zgaruvchilari
- 5.1 \set va \echo
- 5.2 \gset — natijani o'zgaruvchiga
- 5.3 Apostrof tuzog'i
- 6. Fayllar bilan ishlash
- 6.1 \i — SQL faylni bajarish
- 6.2 \copy va COPY farqi
- 6.3 \! va \e
- 7. .psqlrc — o'z sozlamalaringiz
- 8. psql skriptlarda
- 8.1 -c, -f, -At, --csv
- 8.2 -v va -c tuzog'i
- 8.3 ON_ERROR_STOP
- 9. SQL qadami: o'z psql muhitingiz
- 10. Ko'p uchraydigan xatolar
- 10.1 ; unutildi
- 10.2 Meta-buyruqda apostrof
- 10.3 Skriptda xato "yutildi"
- 10.4 COPY fayli "yo'qoldi"
- 10.5 -c da o'zgaruvchi
- 11. Mashqlar
- 1-mashq (oson): buyruqni toping
- 2-mashq (o'rta): natijani oldindan ayting
- 3-mashq (qiyin): hisobot skripti
- 4-mashq: SQL qadami
- 12. Real ishda
- Xulosa
- Manbalar
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=1ni 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\echobilan kichik hisobot skripti yozasiz. \i,\copyva.psqlrcfaylidan foydalanasiz.psql -c,-f,-At,--csvvaON_ERROR_STOPbilan 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):
docker exec -it kanon26-pg psql -U postgres -d vazifalar-it — interaktiv rejim (klaviaturadan yozasiz). Ulangandan keyin psql taklif belgisini (prompt) ko'rsatadi:
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 .-> SNimaga 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:
List of specially treated variables
psql variables:
Usage:
psql --set=NAME=VALUE
or \set NAME VALUE inside psql3. 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):
Parameter | Value
----------------------+---------------------
Database | tajriba
Client User | postgres
Socket Directory | /var/run/postgresql
Server Port | 5432
SSL Connection | false
Superuser | onBiz 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:
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:
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:
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:
Not-null constraints:
"t09_mahsulot_id_not_null" NOT NULL "id"
"t09_mahsulot_nom_not_null" NOT NULL "nom"
Access method: heapNot-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:
vazifalarbazasidagifoydalanuvchilarjadvalining 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:
-[ 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:
SELECT * FROM t09_mahsulot WHERE id = 2 \gxNatija:
-[ RECORD 1 ]--
id | 2
nom | Lag'mon
narx | 28000.004.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:
\pset null '(null)'Endi NULL o'rnida (null) chiqadi. Buni .psqlrc ga qo'yish foydali — pastda ko'ramiz.
4.3 \timing — so'rov vaqti
\timing on
SELECT count(*) FROM generate_series(1, 1000000);Kanon chiqishi:
count
---------
1000000
(1 row)
Time: 222.952 msgenerate_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):
SELECT count(*) AS soni FROM t09_mahsulot \watch i=1 c=2Kanon chiqishi:
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:
\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:
SELECT max(narx) AS eng_qimmat FROM t09_mahsulot \gsetEndi :eng_qimmat = 35000.00. Uni \echo bilan chiqaramiz.
5.3 Apostrof tuzog'i
Kanon shunday yozdi:
\echo Eng qimmat taom: :eng_qimmat so'mNatija:
Eng qimmat taom: 35000.00psql:<stdin>:24: error: unterminated quoted stringTarjimasi: "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):
\echo 'Eng qimmat taom:' :eng_qimmat 'so''m'Biz o'z nusxamizda (psql 17.6) sinadik:
Eng qimmat taom: 35000.00 so'mTekshirib ko'ring:
\set ism 'Ali'dan keyinSELECT * 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):
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:
\copy t09_mahsulot TO '/tmp/t09-menyu.csv' WITH (FORMAT csv, HEADER)Javob COPY 5 — 5 qator yozildi. Fayl ichi:
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.00Shunga 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.csvbilan faylni ko'rdi (yuqoridagi chiqish).\e— oxirgi so'rovni matn muharririda ochadi; saqlab yopsangiz, so'rov bajariladi. MuharrirEDITORyokiPSQL_EDITORmuhit 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:
\set QUIET 1
\pset null '(null)'
\timing on
\set QUIET 0QUIET — 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:
psql -U postgres -d vazifalar -At \
-c "select ism, email from foydalanuvchilar order by id limit 3"Kanon chiqishi:
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:
psql -U postgres -d vazifalar -v email=dilnoza@example.com \
-c "select ism from foydalanuvchilar where email = :'email'"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:
psql -U postgres -d vazifalar \
-c "select 1/0" -c "select 'ON_ERROR_STOP siz davom etdi'"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:
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).
psql -X -1 -v ON_ERROR_STOP=1 -d vazifalar -f 001-jadvallar.sql9. SQL qadami: o'z psql muhitingiz
Bu darsda vazifalar sxemasiga o'zgarish yo'q. Lekin keyingi 30 dars davomida ishlatadigan muhitni tayyorlaymiz:
- Uy papkangizda
.psqlrcyarating (Windows'da%APPDATA%\postgresql\psqlrc.conf):\pset null '(null)',\timing on,\x auto. vazifalarbazasiga ulaning va\dtqiling — hozirchaDid not find any relations.("hech qanday jadval topilmadi") chiqadi.- Loyiha papkasida
sql/papkasini oching — keyingi darsdan boshlab sxema fayllari shu yerda bo'ladi vapsql -X -1 -v ON_ERROR_STOP=1 -fbilan 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
- Serverdagi bazalar ro'yxati — .
- Boshqa bazaga o'tish — .
- Jadval tuzilmasi — .
- So'rov vaqtini ko'rsatish —
\timing. - Bitta so'rov natijasini vertikal chiqarish (
;o'rniga) — . - 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:
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:
Hisobot: <ism>Bajarilgan: <son> / <jami>- 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
\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):
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,
psqlorqali holatni tekshirish — DevOps va backend dasturchining kundalik ishi.\dt+(jadval hajmlari),\x(keng qatorlar),\timingeng ko'p ishlatiladi. - CI va deploy: migratsiya va namuna fayllar
psql -X -1 -v ON_ERROR_STOP=1 -fbilan 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?", "
COPYva\copyfarqi?". 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 daNot-null constraintsbo'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/-fda ham o'qiladi, skriptda-X.- Skriptda
-v ON_ERROR_STOP=1— usiz xatodan keyin davom etadi va 0 qaytaradi;-cda 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
- PostgreSQL 18 hujjati — psql: https://www.postgresql.org/docs/18/app-psql.html
- PostgreSQL 18 hujjati — COPY: https://www.postgresql.org/docs/18/sql-copy.html
- PostgreSQL 18 relizi eslatmalari (NOT NULL cheklovlari katalogda): https://www.postgresql.org/docs/18/release-18.html
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!