Mundarija (35)
- Bu darsda
- 1. Nega bu kerak?
- 2. Mavjud va o'rnatilgan
- 2.1 Ikki bosqich
- 2.2 Versiyalar serverga bog'liq
- 3. O'rnatish, ko'rish, o'chirish
- 3.1 CREATE EXTENSION va \dx
- 3.2 O'chirish va bog'liqliklar
- 3.3 Yangilash
- 4. Kim o'rnata oladi: superuser va trusted
- 5. Foydali kengaytmalar
- 5.1 pgcrypto — hash va tasodifiy baytlar
- 5.2 ltree — daraxt yo'llari
- 5.3 pg_stat_statements — qaysi so'rov qancha vaqt oladi
- 5.4 Allaqachon tanish bo'lganlar
- 6. Serverda yo'q kengaytmalar
- 6.1 Xato qanday ko'rinadi
- 6.2 To'rt mashhur tashqi kengaytma
- 6.3 Managed bazada nima bo'ladi
- 7. Alohida sxema tuzog'i
- 8. Kengaytmalar va migratsiya, zaxira
- 9. Ko'p uchraydigan xatolar
- 9.1 "Lokalda ishladi, serverda yo'q"
- 9.2 shared_preload_libraries ni unutish
- 9.3 DROP EXTENSION … CASCADE ni o'ylamay yozish
- 9.4 UUID uchun uuid-ossp
- 9.5 Kengaytmani alohida sxemaga qo'yib, search_path ni unutish
- 10. Mashqlar
- 1-mashq (oson): Ro'yxat
- 2-mashq (o'rta): Registrsiz login
- 3-mashq (qiyin): Kategoriya daraxti
- 11. Loyiha qadami: kanon tajribasi, loyihaga kirmaydi
- 12. Real ishda
- Xulosa
- Manbalar
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,
trustedva superuser talabini tushuntirasiz. pgcrypto,citext,ltree,pg_stat_statementsbilan 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:
- Server fayllari —
.control,.sqlva (ko'pincha) kompilyatsiya qilingan kutubxona serverningshare/extensionpapkasida bo'lishi kerak. Bu — operatsion tizim darajasi: Postgres bilan birga keladi yoki paket o'rnatiladi. - 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:
SELECT count(*) AS mavjud FROM pg_available_extensions;
SELECT extname, extversion FROM pg_extension; 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:
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; 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) vapg_cronbu serverda yo'q — ular Postgres bilan birga kelmaydi. Kanonningpostgres:18image'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 pgcryptoqilib, 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:
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');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:
\dx 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?
DROP EXTENSION citext;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:
CREATE EXTENSION pgcrypto;
ALTER EXTENSION pgcrypto UPDATE;CREATE EXTENSION
NOTICE: version "1.3" of extension "pgcrypto" is already installed
ALTER EXTENSIONYangi 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):
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; 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:
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;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 ROLEpg_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_trgmesa 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
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; sha256 | bayt | bcrypt
------------------------------------------------------------------+------+--------
038f270ca678c66f5bf393f958e8eebcf98b049e5a0d32a69cabf46b576cabbf | 16 | t
(1 row)digest— SHA-256 hash (hexko'rinishida). Node'dagicreateHash("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:
SELECT gen_random_uuid() IS NOT NULL AS uuid_yadroda; 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:
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;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:
CREATE EXTENSION pg_stat_statements;
SELECT count(*) FROM pg_stat_statements;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:
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
CREATE EXTENSION postgis;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:
CREATE SCHEMA ext;
CREATE EXTENSION hstore SCHEMA ext;
SELECT 'a=>1'::ext.hstore -> 'a' AS hstore_qiymat;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:
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; bir
-----
1
(1 row)
SET
hstore_qiymat
---------------
1
(1 row)
RESET
DROP EXTENSION
DROP SCHEMAOPERATOR(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 …— kanonning104faylidagidek.IF NOT EXISTS— fayl qayta qo'llansa yiqilmaydi. - Zaxirada:
pg_dumpkengaytmaning ichini emas, faqatCREATE EXTENSIONbuyrug'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
CREATEhuquqisiz 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
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):
pg_trgm: ha
ltree: ha
vector: yo'qunnest — 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
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):
AzizSaqlangan 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
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):
Elektronika
Noutbuklar
Telefonlar
Smartfonlar
ajdod: Elektronika
ajdod: TelefonlarORDER 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:
unaccentvapg_trgm—104-qidiruv.sqlda (oldingi dars),CREATE EXTENSION IF NOT EXISTSbilan.btree_gistloyihaga kerak bo'lmagan: 26-qismdagi014istisno chekloviEXCLUDE USING btreebilan 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;
trustedkengaytmalarni bazadaCREATEhuquqi 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 … CASCADEustunlarni o'chiradi; alohida sxemasearch_pathtuzog'ini beradi.
Keyingi dars: Row Level Security — har foydalanuvchi faqat o'z qatorlarini ko'radigan himoyani bazaning o'ziga topshirish.
Manbalar
- PostgreSQL 18 hujjati: CREATE EXTENSION, Packaging Related Objects into an Extension (
trusted) — 2026-10-25 da ko'rildi. - PostgreSQL 18 hujjati: Additional Supplied Modules and Extensions —
pgcrypto,citext,ltree,pg_stat_statements,hstore. - PostgreSQL 18 hujjati: gen_random_uuid (UUID Functions).
- PostGIS: postgis.net; pgvector: github.com/pgvector/pgvector; pg_cron: github.com/citusdata/pg_cron; TimescaleDB: docs.timescale.com — 2026-10-25 da ko'rildi, bu kursda sinalmagan.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!