IlmHamroh
JavaScript Full-stack/27-qism. Ma'lumotlar bazasi chuqur: Postgres, ORM, Mongo, Redis8/65-dars17 daqiqa
Mundarija (35)

PostgreSQL extension'lari: CREATE EXTENSION, pgcrypto, ltree va boshqalar

Qisqacha: Extension (kengaytma) — Postgres'ga yangi tur, funksiya, operator yoki indeks qo'shadigan paket: CREATE EXTENSION pg_trgm;. Kengaytma ikki bosqichda ishlaydi: avval uning fayllari serverga o'rnatilgan bo'lishi kerak (pg_available_extensions), keyin har bazada alohida yoqiladi. Ba'zilari (pg_stat_statements) server ishga tushganda yuklanishi shart, ba'zilari (PostGIS, pgvector, pg_cron) alohida paket. Managed bazada esa faqat provayder ruxsat bergan ro'yxat.

Bu darsda

  • Kengaytmani o'rnatish, ko'rish (\dx), yangilash va o'chirishni bilasiz.
  • "Mavjud" va "o'rnatilgan" kengaytma farqini, trusted va superuser talabini tushuntirasiz.
  • pgcrypto, citext, ltree, pg_stat_statements bilan ishlaysiz.
  • PostGIS, pgvector, pg_cron, TimescaleDB qaysi muammoni hal qilishini bilasiz.
  • Kengaytmani alohida sxemaga qo'yish tuzog'ini va managed bazadagi cheklovlarni bilasiz.

Oldin bilishingiz kerak: Postgres'da full-text search (unaccent, pg_trgm — birinchi kengaytmalarimiz), Massivlar, range, domain va maxsus turlar, psql chuqur.

1. Nega bu kerak?

Oldingi darsda ikki qator yozdik: CREATE EXTENSION unaccent; va CREATE EXTENSION pg_trgm;. Shu ikki qator bazaga butun bir imkoniyat qo'shdi — urg'u belgilarini olib tashlash va trigram qidiruvi. Postgres'ning kuchli tomoni shu: yadro kichik, qolgani kengaytma.

O'xshatish: telefon va ilovalar do'koni. Telefon qo'ng'iroq qiladi, xabar yuboradi. Xarita, bank, taksi kerak bo'lsa — ilova o'rnatasiz. Lekin ilova telefonga mos bo'lishi kerak, ba'zilari maxsus ruxsat so'raydi, korporativ telefonda esa faqat ruxsat etilgan ro'yxatdan o'rnatasiz. Kengaytmalar ham xuddi shunday.

Bu darsdagi so'rovlarni biz ishga tushirdik: PostgreSQL 17.6 (Windows, rasmiy o'rnatuvchi), yangi bo'sh baza. Kanon PostgreSQL 18.6 (postgres:18 Docker image) da xuddi shu tajribani o'tkazgan (IlmHamroh, 2026-10) — natijalar qayerda farq qilsa, ikkalasini ham ko'rsatamiz. Farqning o'zi bu darsning asosiy saboqlaridan biri.

2. Mavjud va o'rnatilgan

2.1 Ikki bosqich

Diagrammada kengaytma qayerdan qayerga yetib borishiga qarang:

flowchart LR
  P["Paket yoki<br/>Docker image"] --> S["Server papkasi<br/>share/extension"]
  S -->|"shared_preload_libraries<br/>(ba'zilariga)"| R["Server qayta<br/>ishga tushadi"]
  S --> C["CREATE EXTENSION<br/>har bazada"]
  R --> C
  C --> O["Turlar, funksiyalar<br/>bazada"]

Kengaytma bazada ishlashi uchun:

  1. Server fayllari — .control, .sql va (ko'pincha) kompilyatsiya qilingan kutubxona serverning share/extension papkasida bo'lishi kerak. Bu — operatsion tizim darajasi: Postgres bilan birga keladi yoki paket o'rnatiladi.
  2. Bazada yoqish — CREATE EXTENSION nom; — faqat shu bazada obyektlar (turlar, funksiyalar) yaratadi. Boshqa bazaga ham kerak bo'lsa — u yerda ham alohida.

Ikkalasini ikki katalogdan ko'ramiz:

sql
SELECT count(*) AS mavjud FROM pg_available_extensions;
SELECT extname, extversion FROM pg_extension;
text
 mavjud
--------
     61
(1 row)

 extname | extversion
---------+------------
 plpgsql | 1.0
(1 row)

Serverimizda 61 ta kengaytma mavjud, bazada esa bitta o'rnatilgan — plpgsql. Ha, Funksiyalar va PL/pgSQL darsidagi til ham kengaytma, faqat har yangi bazada sukut bo'yicha yoqilgan. Kanonning Docker image'ida mavjudlar soni 46 edi — build'ga qarab farq qiladi.

2.2 Versiyalar serverga bog'liq

Kerakli kengaytmalar bormi va qaysi versiyada:

sql
SELECT name, default_version, installed_version
FROM pg_available_extensions
WHERE name IN ('pgcrypto', 'citext', 'pg_trgm', 'ltree',
  'pg_stat_statements', 'postgis', 'vector', 'pg_cron')
ORDER BY name;
text
        name        | default_version | installed_version
--------------------+-----------------+-------------------
 citext             | 1.6             |
 ltree              | 1.3             |
 pg_stat_statements | 1.11            |
 pg_trgm            | 1.6             |
 pgcrypto           | 1.3             |
(5 rows)

Ikki narsa ko'rinadi:

  • Sakkizta nom so'radik — beshtasi qaytdi. postgis, vector (pgvector) va pg_cron bu serverda yo'q — ular Postgres bilan birga kelmaydi. Kanonning postgres:18 image'ida ham yo'q edi.
  • Versiyalar Postgres versiyasiga bog'liq: bizda (17) pgcrypto 1.3, citext 1.6, pg_stat_statements 1.11; kanonda (18) — 1.4, 1.8, 1.12. Kengaytma versiyasi va Postgres versiyasi — alohida raqamlar.

Tekshirib ko'ring: Lokal kompyuteringizda Postgres 17, serverda 16. Siz lokalda CREATE EXTENSION pgcrypto qilib, migratsiya yozdingiz. Serverda nima bo'lishi mumkin?

Javob

Kengaytma serverda mavjud bo'lsa — o'sha serverning default_version i o'rnatiladi, u lokalnikidan eski bo'lishi mumkin. Yangi versiyadagi funksiyani ishlatgan bo'lsangiz — serverda function … does not exist. Shuning uchun lokal va prod Postgres major versiyasi bir xil bo'lishi kerak (kanon Docker'da prod bilan bir xil image ishlatadi), va migratsiyada versiyaga tayangan joyni sinab ko'ring.

3. O'rnatish, ko'rish, o'chirish

3.1 CREATE EXTENSION va \dx

citext (case-insensitive text) — registrga befarq matn turi. Email uchun qulay: Aziz@Example.com va aziz@example.COM — bitta manzil:

sql
CREATE EXTENSION citext;
CREATE TABLE m_foyd (email citext UNIQUE);
INSERT INTO m_foyd VALUES ('Aziz@Example.com');
INSERT INTO m_foyd VALUES ('aziz@example.COM');
text
CREATE EXTENSION
CREATE TABLE
INSERT 0 1
ERROR:  duplicate key value violates unique constraint "m_foyd_email_key"
DETAIL:  Key (email)=(aziz@example.COM) already exists.

Oddiy UNIQUE ikkinchi emailni rad etdi — citext solishtirishni registrsiz qildi. vazifalar loyihasida bu masala boshqacha yechilgan: lower(email) ustidagi noyob indeks (26-qismdagi 001). Ikkalasi ham to'g'ri; citext — "turi o'zi biladi", ifoda indeksi — "kengaytmasiz".

O'rnatilgan kengaytmalar ro'yxati — psql'da \dx:

sql
\dx
text
                           List of installed extensions
  Name   | Version |   Schema   |                   Description
---------+---------+------------+--------------------------------------------------
 citext  | 1.6     | public     | data type for case-insensitive character strings
 plpgsql | 1.0     | pg_catalog | PL/pgSQL procedural language
(2 rows)

Schema ustuniga qarang: citext obyektlari public sxemaga tushdi. Bu pastda muhim bo'ladi.

3.2 O'chirish va bog'liqliklar

Kengaytmani o'chirib bo'ladimi, agar uning turi jadvalda ishlatilsa?

sql
DROP EXTENSION citext;
text
ERROR:  cannot drop extension citext because other objects depend on it
DETAIL:  column email of table m_foyd depends on type citext
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

Postgres himoya qildi. HINT dagi CASCADE ga ehtiyot bo'ling: DROP EXTENSION citext CASCADE — email ustunini ma'lumoti bilan birga o'chiradi. Bu Foreign key va referential actions darsidagi ON DELETE CASCADE dan ham xavfliroq: bitta buyruq bir nechta jadvaldan ustun olib ketadi.

3.3 Yangilash

Postgres yangilangach, kengaytmaning yangi versiyasi fayllari keladi, lekin bazadagi obyektlar eski versiyada qoladi. Yangilash — alohida buyruq:

sql
CREATE EXTENSION pgcrypto;
ALTER EXTENSION pgcrypto UPDATE;
text
CREATE EXTENSION
NOTICE:  version "1.3" of extension "pgcrypto" is already installed
ALTER EXTENSION

Yangi o'rnatilgan — allaqachon eng yangi, NOTICE shuni aytdi. Postgres versiyasini ko'tarish (Postgres versiyasini yangilash) dan keyin har bazada ALTER EXTENSION … UPDATE — tekshiruv ro'yxatining bir bandi.

4. Kim o'rnata oladi: superuser va trusted

Ko'p kengaytmalar C kodini serverga yuklaydi — noto'g'ri ishlatilsa, butun serverni buzishi mumkin. Shuning uchun sukut bo'yicha CREATE EXTENSION faqat superuserga. PostgreSQL 13 dan trusted (ishonchli) kengaytmalar bor: ularni bazada CREATE huquqi bor oddiy foydalanuvchi ham o'rnata oladi. Kanon ro'yxati (PostgreSQL 18.6):

sql
SELECT name, trusted, superuser
FROM pg_available_extension_versions
WHERE name IN ('pgcrypto', 'citext', 'pg_trgm', 'unaccent', 'ltree',
  'pg_stat_statements', 'postgres_fdw', 'btree_gist')
  AND version = (SELECT default_version FROM pg_available_extensions e
                 WHERE e.name = pg_available_extension_versions.name)
ORDER BY 1;
text
        name        | trusted | superuser
--------------------+---------+-----------
 btree_gist         | t       | t
 citext             | t       | t
 ltree              | t       | t
 pg_stat_statements | f       | t
 pg_trgm            | t       | t
 pgcrypto           | t       | t
 postgres_fdw       | f       | t
 unaccent           | t       | t
(8 rows)

Amalda sinaymiz: yangi rol m08_egasi ga o'z bazasini beramiz va kengaytmalarni u nomidan o'rnatamiz. \c — psql'da boshqa bazaga ulanish:

sql
CREATE ROLE m08_egasi;
CREATE DATABASE m08_baza OWNER m08_egasi;
\c m08_baza
SET ROLE m08_egasi;
CREATE EXTENSION pg_trgm;
CREATE EXTENSION postgres_fdw;
RESET ROLE;
\c postgres
DROP DATABASE m08_baza;
DROP ROLE m08_egasi;
text
CREATE ROLE
CREATE DATABASE
You are now connected to database "m08_baza" as user "postgres".
SET
CREATE EXTENSION
ERROR:  permission denied to create extension "postgres_fdw"
HINT:  Must be superuser to create this extension.
RESET
You are now connected to database "postgres" as user "postgres".
DROP DATABASE
DROP ROLE

pg_trgm (trusted) — o'rnatildi. postgres_fdw — boshqa serverlarga ulanish imkonini beradi, shuning uchun ishonchsiz: faqat superuser. Bu farq managed bazalarda juda muhim — u yerda sizga superuser berilmaydi (pastda).

Tekshirib ko'ring: Nega postgres_fdw (boshqa serverdagi jadvalni o'qish) trusted emas, pg_trgm esa trusted?

Javob

pg_trgm faqat matn ustida hisob qiladi. U bazadan tashqariga chiqmaydi va boshqa foydalanuvchining ma'lumotiga yo'l ochmaydi. postgres_fdw esa server nomidan tarmoqqa ulanadi: oddiy foydalanuvchi uni ishlatib, server turgan tarmoqdagi ichki bazalarga yetib borishi mumkin. Trusted — "huquqlarni oshirib bo'lmaydi" degan kafolat.

5. Foydali kengaytmalar

5.1 pgcrypto — hash va tasodifiy baytlar

sql
SELECT encode(digest('salom', 'sha256'), 'hex') AS sha256,
       length(gen_random_bytes(16)) AS bayt,
       crypt('parol123', gen_salt('bf', 10)) LIKE '$2a$10$%'
         AS bcrypt;
text
                              sha256                              | bayt | bcrypt
------------------------------------------------------------------+------+--------
 038f270ca678c66f5bf393f958e8eebcf98b049e5a0d32a69cabf46b576cabbf |   16 | t
(1 row)
  • digest — SHA-256 hash (hex ko'rinishida). Node'dagi createHash("sha256") bilan bir xil natija beradi (crypto 1: tasodif, hash va HMAC).
  • gen_random_bytes — kriptografik tasodifiy baytlar.
  • crypt + gen_salt('bf') — bcrypt parol hash'i.

Parol hash'ini bazada qilish mumkin, lekin kursda buni ilovada qilamiz (28-qism: argon2/bcrypt). Sabab: parol bazaga ochiq matnda bormasin — u SQL log'iga, pg_stat_statements ga, sekin so'rovlar jurnaliga tushib qolishi mumkin.

UUID uchun esa pgcrypto ham, uuid-ossp ham kerak emas — gen_random_uuid() PostgreSQL 13 dan beri yadroda:

sql
SELECT gen_random_uuid() IS NOT NULL AS uuid_yadroda;
text
 uuid_yadroda
--------------
 t
(1 row)

Eski maqolalardagi CREATE EXTENSION "uuid-ossp" — eski odat. (Primary key tanlovi darsida UUID turlarini ko'rgansiz.)

5.2 ltree — daraxt yo'llari

Kategoriyalar daraxti: oziq-ovqat → meva → olma. Rekursiv CTE bilan ota-bola jadvalini aylanib chiqish mumkin. ltree boshqacha yo'l: har qatorga to'liq yo'lni yozish (oziq.meva.olma) va maxsus operatorlar bilan qidirish:

sql
CREATE EXTENSION ltree;
CREATE TABLE kategoriya (yol ltree PRIMARY KEY);
INSERT INTO kategoriya VALUES ('oziq'), ('oziq.meva'),
  ('oziq.meva.olma'), ('oziq.sabzavot'), ('kiyim'), ('kiyim.erkak');
SELECT yol, nlevel(yol) FROM kategoriya
WHERE yol <@ 'oziq' ORDER BY yol;
SELECT yol FROM kategoriya WHERE yol ~ '*.meva.*' ORDER BY yol;
text
CREATE EXTENSION
CREATE TABLE
INSERT 0 6
      yol       | nlevel
----------------+--------
 oziq           |      1
 oziq.meva      |      2
 oziq.meva.olma |      3
 oziq.sabzavot  |      2
(4 rows)

      yol
----------------
 oziq.meva
 oziq.meva.olma
(2 rows)

<@ — "ichida" (o'zi va hamma avlodlari), nlevel — chuqurlik, ~ — naqsh (* — istalgan qism). GiST indeks bilan million qatorli katalogda ham tez. Kamchiligi: kategoriya nomi o'zgarsa yoki ko'chirilsa — butun shoxdagi yo'llar qayta yoziladi.

5.3 pg_stat_statements — qaysi so'rov qancha vaqt oladi

Sekin so'rovlarni topish darsining asosiy vositasi. Har so'rov shakli bo'yicha chaqiruvlar soni va umumiy vaqtni yig'adi. Lekin u boshqalardan farq qiladi — server ishga tushganda xotira ajratishi kerak:

sql
CREATE EXTENSION pg_stat_statements;
SELECT count(*) FROM pg_stat_statements;
text
CREATE EXTENSION
ERROR:  pg_stat_statements must be loaded via "shared_preload_libraries"

Tarjimasi: "pg_stat_statements shared_preload_libraries orqali yuklanishi kerak". CREATE EXTENSION o'tdi (funksiya va view yaratildi), lekin ma'lumot yig'adigan qism serverda yo'q. Yechim — postgresql.conf da (yoki ALTER SYSTEM) sozlama va serverni qayta ishga tushirish:

sql
ALTER SYSTEM SET shared_preload_libraries = 'pg_stat_statements';
-- keyin: pg_ctl restart (yoki Docker konteynerini qayta yoqish)

Kanon konteynerini shu sozlama bilan ishga tushirgan, shuning uchun u yerda SHOW shared_preload_libraries → pg_stat_statements va count(*) > 0 → t. Sozlamalar va qayta ishga tushirishni Postgres arxitekturasi va asosiy sozlamalar darsida chuqur ko'ramiz. Diqqat: shared_preload_libraries — ro'yxat; boshqa kengaytma ham kerak bo'lsa, vergul bilan qo'shing, ustidan yozib yubormang.

5.4 Allaqachon tanish bo'lganlar

Kengaytma Nima Qayerda ko'rdik
pg_trgm trigram o'xshashlik, LIKE '%…%' indeksi Indeks turlari, full-text search
unaccent é → e full-text search (uz_normal)
btree_gist oddiy turlar uchun GiST — EXCLUDE da = Massivlar, range, domain (bron)
pgstattuple, pageinspect jadval va sahifa ichini ko'rish MVCC; VACUUM, autovacuum va bloat
hstore kalit-qiymat turi (JSONB'dan oldingi) pastda — tuzoq misoli

6. Serverda yo'q kengaytmalar

6.1 Xato qanday ko'rinadi

sql
CREATE EXTENSION postgis;
text
ERROR:  extension "postgis" is not available
DETAIL:  Could not open extension control file "C:/Program Files/PostgreSQL/17/share/extension/postgis.control": No such file or directory.
HINT:  The extension must first be installed on the system where PostgreSQL is running.

Tarjimasi: "kengaytma mavjud emas — avval Postgres ishlayotgan tizimga o'rnatilishi kerak". Bizning PG 17 yana DETAIL qatorini ham berdi — qaysi fayl topilmadi. Kanonning PG 18 chiqishida faqat ERROR va HINT (vector va pg_cron uchun ham xuddi shunday). Bu SQL bilan hal bo'lmaydi: paket o'rnatish yoki boshqa Docker image kerak.

6.2 To'rt mashhur tashqi kengaytma

Bular bu kursda sinalmagan (PostGIS — keyingi darsda alohida image bilan), tavsif rasmiy hujjatlar bo'yicha, 2026-10-25:

Kengaytma Muammo Qanday o'rnatiladi
PostGIS xarita: masofa, radius, poligon postgis/postgis image yoki OS paketi; PostGIS va geo so'rovlar
pgvector (vector) AI embedding'lar, ma'no bo'yicha qidiruv pgvector/pgvector image yoki paket; Vektor bazalar va pgvector
pg_cron bazaning ichida jadval bo'yicha ish (har kecha VACUUM, eski loglarni o'chirish) paket + shared_preload_libraries
TimescaleDB vaqt qatorlari (sensor, metrika) uchun avtomatik bo'laklash alohida image; litsenziyasi qismlarga bo'lingan — tekshiring

6.3 Managed bazada nima bo'ladi

Bulutdagi managed Postgres (AWS RDS, Google Cloud SQL, Azure, Supabase, Neon …) sizga superuser bermaydi va o'z ruxsat etilgan ro'yxatini ushlaydi. Odatda pg_trgm, pgcrypto, citext, pg_stat_statements deyarli hammada bor; PostGIS va pgvector — ko'pchiligida; pg_cron, TimescaleDB — provayderga qarab. Bu kursda hech qaysi managed xizmat sinalmagan; aniq ro'yxat — har provayderning "Supported extensions" hujjatida. Managed va serverless Postgres darsida batafsil.

Amaliy qoida: loyiha boshida kerakli kengaytmalar ro'yxatini yozing va tanlagan provayderingizda borligini oldindan tekshiring. Lokal Docker'da ishlagan migratsiya prod'da is not available bilan to'xtashi — ko'p uchraydigan voqea.

Tekshirib ko'ring: Jamoangiz pg_cron bilan "har kecha eski sessiyalarni o'chir" ishini qurmoqchi. Provayderingizda pg_cron yo'q. Qanday muqobil bor?

Javob

Jadval bo'yicha ishni bazadan tashqariga chiqarish: ilova serveridagi cron, Node'dagi rejalashtiruvchi (29-qismda fon vazifalari) yoki bulutning rejalashtirilgan funksiyalari. Ish bazada Funksiyalar va PL/pgSQL darsidagidek protsedura sifatida qoladi — tashqi rejalashtiruvchi faqat CALL eski_sessiyalarni_ochir() ni chaqiradi.

7. Alohida sxema tuzog'i

Kengaytmalar sukut bo'yicha public sxemaga tushadi. Ba'zi jamoalar tartib uchun ularni alohida sxemaga qo'yadi (SCHEMA ext). Kanon buni sinab, tuzoq topdi:

sql
CREATE SCHEMA ext;
CREATE EXTENSION hstore SCHEMA ext;
SELECT 'a=>1'::ext.hstore -> 'a' AS hstore_qiymat;
text
CREATE SCHEMA
CREATE EXTENSION
ERROR:  operator does not exist: ext.hstore -> unknown
LINE 1: SELECT 'a=>1'::ext.hstore -> 'a' AS hstore_qiymat;
                                  ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

Turni to'liq nom bilan topdik (ext.hstore), lekin -> operatori ham ext sxemasida — va u search_path da yo'q. Operatorni nomi bilan yozib bo'lmaydi (ext.-> emas). Ikki yechim:

sql
SELECT 'a=>1'::ext.hstore OPERATOR(ext.->) 'a' AS bir;
SET search_path = public, ext;
SELECT 'a=>1'::hstore -> 'a' AS hstore_qiymat;
RESET search_path;
DROP EXTENSION hstore;
DROP SCHEMA ext;
text
 bir
-----
 1
(1 row)

SET
 hstore_qiymat
---------------
 1
(1 row)

RESET
DROP EXTENSION
DROP SCHEMA

OPERATOR(ext.->) — noqulay; search_path ga qo'shish — oddiyroq, lekin har ulanishda (yoki ALTER DATABASE … SET search_path) sozlash kerak. Funksiyalar va PL/pgSQL darsidagi SECURITY DEFINER + SET search_path = pg_catalog, pg_temp funksiyalari esa endi bu operatorni ko'rmaydi — ular uchun ext ni ham qo'shasiz. Kichik loyihada kengaytmalarni public da qoldirish ko'pincha eng sodda yo'l (kanon ham shunday qilgan).

8. Kengaytmalar va migratsiya, zaxira

  • Migratsiyada: CREATE EXTENSION IF NOT EXISTS … — kanonning 104 faylidagidek. IF NOT EXISTS — fayl qayta qo'llansa yiqilmaydi.
  • Zaxirada: pg_dump kengaytmaning ichini emas, faqat CREATE EXTENSION buyrug'ini yozadi. Tiklanadigan serverda kengaytma mavjud bo'lishi kerak (Backup va restore).
  • Kim o'rnatadi: ilova roli emas, migratsiya roli yoki administrator (Rollar va huquqlar) — ilova CREATE huquqisiz ishlaydi.

9. Ko'p uchraydigan xatolar

9.1 "Lokalda ishladi, serverda yo'q"

extension "…" is not available. Loyiha boshida kengaytmalar ro'yxati, lokal va prod bir xil image/versiya.

9.2 shared_preload_libraries ni unutish

pg_stat_statements must be loaded via "shared_preload_libraries". Sozlama + qayta ishga tushirish; mavjud ro'yxatga qo'shish.

9.3 DROP EXTENSION … CASCADE ni o'ylamay yozish

Kengaytma turidagi ustunlar ma'lumoti bilan o'chadi. Avval CASCADE siz — DETAIL nimaga bog'liqligini aytadi.

9.4 UUID uchun uuid-ossp

Ortiqcha bog'liqlik. gen_random_uuid() (PG 13+, yadroda).

9.5 Kengaytmani alohida sxemaga qo'yib, search_path ni unutish

operator does not exist. search_path ga qo'shish yoki public da qoldirish.

10. Mashqlar

Mashqlar kurs/mashqlar/27/08-extensionlar/ da. Ular istalgan bazada bajariladi va oxirida o'zi yaratganini o'chiradi; yechimlar tekshirilgan (biz ishga tushirdik, PostgreSQL 17.6).

1-mashq (oson): Ro'yxat

Bazangizda o'rnatilgan kengaytmalar sonini va pg_trgm, ltree, vector serverda mavjudmi — uchala nom uchun ha/yo'q chiqaring. Ishora: EXISTS (SELECT 1 FROM pg_available_extensions WHERE name = …) va CASE.

Yechim
sql
SELECT n || ': ' || CASE WHEN EXISTS (
         SELECT 1 FROM pg_available_extensions WHERE name = n)
       THEN 'ha' ELSE 'yo''q' END
FROM unnest(ARRAY['pg_trgm', 'ltree', 'vector']) AS n;

Biz ishga tushirdik (psql -X -q -A -t, PostgreSQL 17.6, Windows):

text
pg_trgm: ha
ltree: ha
vector: yo'q

unnest — massivni qatorlarga ochadi (Massivlar, range, domain). Sizning serveringizda vector bo'lishi mumkin — bu mashqning maqsadi aynan tekshirish.

2-mashq (o'rta): Registrsiz login

citext bilan m08_foydalanuvchi (login citext PRIMARY KEY) jadvalini yarating, Aziz ni qo'shing va WHERE login = 'AZIZ' bilan topilishini ko'rsating. Oxirida jadval va kengaytmani xavfsiz tartibda o'chiring (avval jadval). Natija: topilgan login.

Yechim
sql
CREATE EXTENSION IF NOT EXISTS citext;
CREATE TABLE m08_foydalanuvchi (login citext PRIMARY KEY);
INSERT INTO m08_foydalanuvchi VALUES ('Aziz');
SELECT login FROM m08_foydalanuvchi WHERE login = 'AZIZ';
DROP TABLE m08_foydalanuvchi;
DROP EXTENSION citext;

Biz ishga tushirdik (psql -X -q -A -t, PostgreSQL 17.6):

text
Aziz

Saqlangan qiymat o'zgarmadi (Aziz), faqat solishtirish registrsiz. Jadval avval o'chirildi — shuning uchun DROP EXTENSION ga CASCADE kerak bo'lmadi.

3-mashq (qiyin): Kategoriya daraxti

ltree bilan m08_kategoriya (yol ltree PRIMARY KEY, nom text) jadvalini yarating: elektronika (Elektronika), elektronika.telefon (Telefonlar), elektronika.telefon.smartfon (Smartfonlar), elektronika.noutbuk (Noutbuklar), kitob (Kitoblar). (1) elektronika ichidagi hamma kategoriyani chuqurlik bo'yicha chekinish bilan chiqaring (repeat(' ', nlevel(yol) - 1) || nom), (2) smartfon ning hamma ajdodlarini (o'zidan tashqari) chiqaring. Ishora: ajdod — yol @> 'elektronika.telefon.smartfon' va yol <> …; tartib — ORDER BY yol.

Yechim
sql
CREATE EXTENSION IF NOT EXISTS ltree;
CREATE TABLE m08_kategoriya (yol ltree PRIMARY KEY, nom text);
INSERT INTO m08_kategoriya VALUES
  ('elektronika', 'Elektronika'),
  ('elektronika.telefon', 'Telefonlar'),
  ('elektronika.telefon.smartfon', 'Smartfonlar'),
  ('elektronika.noutbuk', 'Noutbuklar'),
  ('kitob', 'Kitoblar');
SELECT repeat('  ', nlevel(yol) - 1) || nom
FROM m08_kategoriya WHERE yol <@ 'elektronika' ORDER BY yol;
SELECT 'ajdod: ' || nom FROM m08_kategoriya
WHERE yol @> 'elektronika.telefon.smartfon'
  AND yol <> 'elektronika.telefon.smartfon'
ORDER BY yol;
DROP TABLE m08_kategoriya;

Biz ishga tushirdik (psql -X -q -A -t, PostgreSQL 17.6):

text
Elektronika
  Noutbuklar
  Telefonlar
    Smartfonlar
ajdod: Elektronika
ajdod: Telefonlar

ORDER BY yol daraxtni "chuqurlikka birinchi" tartibda beradi: ota, keyin uning bolalari alifbo bo'yicha. @> — "o'z ichiga oladi" (ajdod), <@ — "ichida" (avlod).

11. Loyiha qadami: kanon tajribasi, loyihaga kirmaydi

Bu darsda vazifalar sxemasiga yangi migratsiya yo'q. Loyihada kengaytmalar allaqachon ishlatilgan:

  • unaccent va pg_trgm — 104-qidiruv.sql da (oldingi dars), CREATE EXTENSION IF NOT EXISTS bilan.
  • btree_gist loyihaga kerak bo'lmagan: 26-qismdagi 014 istisno cheklovi EXCLUDE USING btree bilan qurilgan — oddiy B-tree yetadi.

Boshqa kengaytmalar nega yo'q (kanonda bunday migratsiya yo'q; sababi — bizning tahlilimiz). citext kerak emas: email noyobligi lower(email) ifoda indeksi bilan allaqachon ishlaydi. Ikkinchi yo'l faqat chalkashtiradi. pgcrypto qo'shilmaydi — parol hash'i 28-qismda ilovada. pg_stat_statements esa sxema emas, server sozlamasi: kanon Docker konteynerida shared_preload_libraries bilan yoqilgan va Monitoring va favqulodda vaziyatlar darsida ishlatiladi.

12. Real ishda

  • Har yangi loyiha boshida "qaysi kengaytmalar kerak va provayderimizda bormi?" savoli — arxitektura qarorining bir qismi.
  • pgvector 2023 yildan beri AI ilovalarida eng tez o'sgan kengaytmalardan; ko'p jamoa alohida vektor baza o'rniga Postgres'ni tanlaydi.
  • pg_stat_statements — DBA va backend dasturchining birinchi vositasi: "eng ko'p vaqt olgan 10 ta so'rov".
  • Intervyu: "Postgres'ning qaysi kengaytmalarini ishlatgansiz?", "Managed bazada nimaga e'tibor berasiz?".

Xulosa

  • Kengaytma = server fayllari (pg_available_extensions) + bazada yoqish (CREATE EXTENSION, pg_extension, \dx).
  • Versiyalar Postgres major versiyasiga bog'liq; yangilashdan keyin ALTER EXTENSION … UPDATE.
  • Sukut bo'yicha superuser o'rnatadi; trusted kengaytmalarni bazada CREATE huquqi borlar ham.
  • pg_stat_statements — shared_preload_libraries + qayta ishga tushirish; PostGIS, pgvector, pg_cron — alohida paket/image.
  • Managed bazada — provayder ro'yxati; loyiha boshida tekshiring.
  • DROP EXTENSION … CASCADE ustunlarni o'chiradi; alohida sxema search_path tuzog'ini beradi.

Keyingi dars: Row Level Security — har foydalanuvchi faqat o'z qatorlarini ko'radigan himoyani bazaning o'ziga topshirish.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
PostgreSQL extension'lari: CREATE EXTENSION, pgcrypto, ltree va boshqalar — IlmHamroh