Mundarija (31)
- Bu darsda
- 1. Nega bu kerak?
- 2. Arxitektura
- 2.1 So'rov qayerdan o'tadi
- 2.2 Prisma 6 dan farqi
- 2.3 Nega adapter yaxshi
- 3. O'rnatish
- 3.1 Uchta paket
- 3.2 npm ci chiqishi
- 3.3 Hajm
- 4. prisma init — nimani yasaydi
- 5. prisma.config.ts
- 5.1 Kanon varianti
- 5.2 Kanon topilmasi: env() va generate
- 5.3 .env ni kim o'qiydi
- 6. schema.prisma: generator va datasource
- 7. Birinchi so'rov
- 8. Mavjud bazadan sxema: db pull
- 8.1 Introspection
- 8.2 Prisma nimani ko'rmaydi
- 8.3 Kanon topilmasi: generated ustun
- 8.4 Qo'lda tartiblash
- 9. Ko'p uchraydigan xatolar
- 10. Mashqlar
- 1-mashq (oson): qism va vazifa
- 2-mashq (o'rta): URL'ni log uchun yashirish
- 3-mashq (qiyin): config qachon URL so'raydi
- 11. Loyiha qadami: holat 20 — Prisma'ni o'rnatish
- 12. Real ishda
- Xulosa
- Manbalar
Prisma 7: o'rnatish va arxitektura — driver adapter, prisma.config.ts va db pull
Qisqacha: Prisma 7 — TypeScript ORM:
schema.prismafaylidagi modellardan tipli client yasaydi (prisma generate). 7-versiyada Rust'da yozilgan query engine olib tashlandi: so'rovni TypeScript/WASM "query compiler" SQL'ga aylantiradi, bazaga esa driver adapter (@prisma/adapter-pg— ichida bizga tanishpg) yuboradi. Sozlamaprisma.config.tsda, generatorprisma-client— client sizningsrc/papkangizga yoziladi. Mavjud bazadan sxema olish —prisma db pull.
Bu darsda
- Prisma 7 qanday qismlardan iboratini va so'rov qaysi yo'ldan o'tishini tushuntirasiz.
prisma,@prisma/clientva@prisma/adapter-pgni o'rnatib, nima uchun har biri kerakligini bilasiz.prisma.config.ts,schema.prismava generator sozlamalarini o'qiy olasiz.- Mavjud bazani
db pullbilan introspection qilib, Prisma nimani ko'rmasligini bilasiz. vazifalar-apiga Prisma'ni ulash uchun birinchi qadamni qo'yasiz (holat 20 boshlanishi).
Oldin bilishingiz kerak: ORM, query builder va raw SQL, node-postgres (pg) asoslari, Connection pooling, TypeScript'ni Node'da ishga tushirish.
1. Nega bu kerak?
Oldingi darsda Prisma'ni ORM sifatida ko'rdik: db.vazifa.findMany(…) — va TypeScript vazifa ning har maydonini biladi. Bu "sehr" qayerdan keladi? Prisma schema.prisma faylini o'qib, unga mos TypeScript kodini yasab beradi — bu kod sizning loyihangizda turadi va har sxema o'zgarishida qayta yasaladi.
Prisma'ni boshqa ORM'lardan ajratadigan narsa — aynan shu kod generatsiyasi. Shuning uchun uni o'rnatish "bitta paket" emas: CLI, generatsiya qilingan client, va bazaga ulanadigan adapter — uchta alohida qism. Ularni tushunmasangiz, xatolar g'alati ko'rinadi: "client topilmadi", "URL topilmadi", "Do not know how to serialize a BigInt".
Prisma 7 (2025-yil 19-noyabrdan) arxitekturani ancha o'zgartirdi. Internetdagi ko'p qo'llanmalar hali 5–6-versiya uchun yozilgan — prisma-client-js, .env avtomatik o'qilishi, url = env(...) sxema ichida. Bu darsda aynan 7-versiya, kanondagi 7.10.1.
Diqqat: Kanon: Prisma 7.10.1, PostgreSQL 18.6, Node 24.21.0, npm 11.19.0 (2026-10-25). Biz holat 20 nusxasini o'z kompyuterimizda
npm ciqilib, PostgreSQL 17.6 klasterimizga ulab ishga tushirdik — "biz ishga tushirdik" deb belgilangan chiqishlar shundan. Prisma Postgres, Accelerate va boshqa bulut xizmatlari — sinalmagan (hisob kerak).
2. Arxitektura
2.1 So'rov qayerdan o'tadi
flowchart TD
A["db.vazifa.findMany()"] --> C[Prisma Client]
C --> Q[Query compiler: TS/WASM]
Q -->|SQL + parametrlar| AD["Driver adapter: @prisma/adapter-pg"]
AD --> P[pg.Pool]
P --> DB[(PostgreSQL)]
CLI[prisma CLI] --> SE[schema-engine binari]
SE --> DBDiagrammada ikki yo'l bor. Ilova yo'li (yuqorida): client so'rovni query compiler'ga beradi, u SQL yasaydi, adapter esa uni oddiy pg.Pool orqali yuboradi. Query compiler — JS obyektidan ({ where: … }) SQL matni yasaydigan qism; uning bir bo'lagi WASM'da (WebAssembly — Node ichida tez ishlaydigan ikkilik kod), shuning uchun alohida dastur kerak emas. CLI yo'li (pastda): prisma db pull va migratsiyalar alohida schema-engine dasturi orqali ishlaydi — u faqat dasturchi kompyuterida va deploy paytida kerak.
2.2 Prisma 6 dan farqi
| Prisma 5–6 | Prisma 7 | |
|---|---|---|
| So'rov yasash | Rust query engine (binar) | TS/WASM query compiler |
| Bazaga ulanish | engine o'zi | driver adapter (majburiy) |
| Generator | prisma-client-js → node_modules |
prisma-client → sizning output papkangiz |
| Ulanish satri | schema.prisma da url = env(...) |
prisma.config.ts da |
.env |
CLI o'zi o'qirdi | o'qimaydi |
Bizning prisma --version (biz ishga tushirdik, Windows 11):
prisma : 7.10.1
@prisma/client : 7.10.1
Node.js : v24.21.0
TypeScript : 6.0.3
Query Compiler : enabled
Schema Engine : schema-engine-cli d1b3f377ca835d73fd50954a5e22128b9ebdd6b8 (at node_modules\@prisma\engines\schema-engine-windows.exe)
Preview Features : partialIndexesQuery Compiler : enabled — Rust engine yo'q. Schema Engine esa binar bo'lib qoldi (Windows'da .exe) — u CLI uchun.
2.3 Nega adapter yaxshi
Adapter pg ni ishlatadi — demak Connection pooling darsida o'rgangan hamma narsa (max, timeout'lar, application_name, error hodisasi) Prisma bilan ham sizning nazoratingizda. Kanon aynan shuni qiladi: hovuzni o'zi yaratib, adapter'ga beradi. Rust engine davrida hovuz engine ichida yashirin edi.
Tekshirib ko'ring: Prisma 7 serverda (prod) ishlashi uchun
schema-enginebinari kerakmi?
Javob
Ilovaning o'zi uchun — yo'q: so'rovlar query compiler va adapter orqali o'tadi. Binar faqat CLI buyruqlari uchun (db pull, migrate). Agar migratsiyalarni deploy paytida serverda ishga tushirsangiz, o'sha bosqichda CLI kerak bo'ladi — bu Migratsiyani deploy jarayonida qo'llash darsida.
3. O'rnatish
3.1 Uchta paket
npm i --save-exact @prisma/client@7.10.1 @prisma/adapter-pg@7.10.1
npm i -D --save-exact prisma@7.10.1| Paket | Qayerda | Nima uchun |
|---|---|---|
prisma |
dev | CLI: generate, db pull, migrate |
@prisma/client |
prod | generatsiya qilingan client ishlatadigan runtime |
@prisma/adapter-pg |
prod | pg orqali ulanish |
pg loyihada 26-qismdan bor. Versiyalar aniq (--save-exact) — CLI va client versiyasi bir xil bo'lishi shart, aks holda generatsiya qilingan kod runtime bilan mos kelmasligi mumkin.
Diqqat: Versiyasiz
npm i prismayozmang. 2026-10-27 holatida npm'dagilatestyorlig'i —8.0.0-rc.27(Prisma 8 ning sinov versiyasi), 7-versiya esaprevyorlig'ida. prisma.io/docs ham sukut bo'yicha Prisma 8 ni ko'rsatadi; 7-versiya hujjati —/docs/orm/v7bo'limida. Kurs 7.10.1 da qoladi (ORM tanlash qo'llanmasi darsida ham shu haqda).
3.2 npm ci chiqishi
Holat 20 ni npm ci qilganimizda (biz ishga tushirdik, npm 11.19.0) oxirgi qatorlar shunday edi:
> vazifalar-api@1.0.0 postinstall
> prisma generate
Loaded Prisma config from prisma.config.ts.
Prisma schema loaded from prisma\schema.prisma.
✔ Generated Prisma Client (7.10.1) to .\src\generated\prisma in 715ms
added 370 packages in 2m
npm warn install-scripts 2 packages have install scripts not yet covered by allowScripts:
npm warn install-scripts @prisma/engines@7.10.1 (postinstall: node scripts/postinstall.js)
npm warn install-scripts prisma@7.10.1 (preinstall: node scripts/preinstall-entry.js)Ikki narsaga qarang:
postinstall: prisma generate— loyiha skripti: harnpm cidan keyin client avtomatik yasaladi (u git'da emas, quyida).install-scriptsogohlantirishi — npm 11 ning yangi himoyasi: paketlarning o'rnatish skriptlari ruxsatsiz ishlamaydi (Ta'minot zanjiri xavfsizligi mavzusi). Prisma'ning skriptlari ishlamadi, lekin kanon tekshirdi: binar paket ichida keladi, hammasi baribir ishladi.
3.3 Hajm
Prisma qo'shilishi loyihani sezilarli og'irlashtiradi:
- 26: pg, hammasi66 MB
- 27: Prisma, hammasi375 MB
- 26: pg, prod15 MB
- 27: Prisma, prod330 MB
- 27: prod + --omit=optional89 MB
Manba: Kanon o'lchovi (holat 20: butun papka va prod o'rnatish), Node 24.21.0, npm 11.19.0, 2026-10-25
Grafikda nimaga qarash kerak: Prisma'siz prod o'rnatish 15 MB edi, Prisma bilan — 330 MB. Sabab — @prisma/client ning ixtiyoriy peer bog'liqliklari (prisma CLI, typescript): lock faylda ular devOptional bo'lib qoladi va --omit=dev ularni olib tashlamaydi. Faqat --omit=dev --omit=optional 89 MB gacha tushirdi (@prisma/client o'zi 72 MB — hamma bazalar uchun runtime). Bu Prisma prodakshnda darsida chuqur.
4. prisma init — nimani yasaydi
Bo'sh papkada prisma init ni ishga tushirdik (biz ishga tushirdik, 7.10.1):
npx prisma init --datasource-provider postgresqlNatija (qisqartirilgan):
Initialized Prisma in your project
prisma/
schema.prisma
prisma7.config.ts
.env
.gitignore
.claude/skills/
.windsurf/skills/
.agents/skills/
skills-lock.jsonIkki kutilmagan narsa:
- Config fayli
prisma7.config.tsdeb nomlandi va ichidaimport "dotenv/config"bor — ya'nidotenvpaketini kutadi. Prisma CLI bu nomni ham taniydi (biz tekshirdik:dotenvo'rnatilmagani uchunCannot find module 'dotenv/config'xatosi chiqdi). Kanon esa hujjatdagiprisma.config.tsnomini vadotenvsiz yondashuvni ishlatadi (pastda). initAI-yordamchilar uchun "skill" papkalarini ham yaratdi (.claude/,.windsurf/,.agents/). Ular loyihaga kerak bo'lmasa — o'chiring yoki.gitignorega qo'shing; har holdagit statusni ko'rmasdan commit qilmang.
Mavjud loyihaga Prisma qo'shganda init shart emas — kanon fayllarni qo'lda yozdi.
5. prisma.config.ts
5.1 Kanon varianti
// fayl: prisma.config.ts
import { defineConfig } from "prisma/config";
const url = process.env["DATABASE_URL"];
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: { path: "prisma/migrations" },
...(url === undefined ? {} : { datasource: { url } }),
});Uch sozlama: sxema fayli qayerda, migratsiyalar qayerda va bazaning manzili. Oxirgi qator g'alati ko'rinadi — nega datasource faqat DATABASE_URL bo'lsa qo'shiladi?
5.2 Kanon topilmasi: env() va generate
Hujjatdagi odatiy yozuv — datasource: { url: env("DATABASE_URL") }. Kanon uni sinadi va prisma generate ham — bazaga umuman ulanmaydigan buyruq — URL'siz yiqildi. Biz takrorladik (DATABASE_URL o'rnatilmagan):
Failed to load config file "…\prisma.env.config.ts" as a TypeScript/JavaScript module. Error: PrismaConfigEnvError: Cannot resolve environment variable: DATABASE_URL."Config faylini yuklab bo'lmadi: DATABASE_URL muhit o'zgaruvchisini topib bo'lmadi". Bu npm ci (postinstall'dagi generate) va CI'da muammo: ular odatda bazasiz ishlaydi. Shuning uchun kanon process.env ni o'zi o'qiydi va URL bo'lmasa datasource ni umuman bermaydi — generate o'tadi, db pull/migrate esa URL'ni talab qiladi.
5.3 .env ni kim o'qiydi
Prisma 7 .env faylini o'zi o'qimaydi. Kanon dotenv qo'shmaydi — 24-qismda o'rgangan Node'ning o'z imkoniyati bor: node --env-file-if-exists=.env. package.json dagi skriptlar shunday (kanon, qisqartirilgan):
{
"scripts": {
"start": "node --env-file-if-exists=.env src/server.ts",
"postinstall": "prisma generate",
"db:generate": "prisma generate"
}
}db pull kabi bazaga ulanadigan buyruqlarda URL'ni terminalda berasiz yoki shu usul bilan skript yozasiz (migratsiya skripti — Prisma Migrate chuqur darsida).
6. schema.prisma: generator va datasource
generator client {
provider = "prisma-client"
output = "../src/generated/prisma"
previewFeatures = ["partialIndexes"]
moduleFormat = "esm"
importFileExtension = "ts"
}
datasource db {
provider = "postgresql"
}(Prisma sxema tili — o'z tili; sayt uni alohida bo'yamaydi.) Satrma-satr:
provider = "prisma-client"— Prisma 7 ning yangi generatori: client TypeScript fayllar sifatidaoutputpapkasiga yoziladi.output—src/generated/prisma. Kod sizning loyihangizda,node_modulesichida emas: import yo'li aniq (./generated/prisma/client.ts).moduleFormat = "esm"— loyiha ESM ("type": "module", 24-qism).importFileExtension = "ts"— generatsiya qilingan fayllar bir-birini.tskengaytmasi bilan import qiladi. Shu tufayli Node 24 ularni bundler va build'siz, type stripping bilan to'g'ridan ishga tushiradi (TypeScript'ni Node'da ishga tushirish). Kanon tekshirdi:tscstrict (exactOptionalPropertyTypes,erasableSyntaxOnly) ham o'tdi.previewFeatures = ["partialIndexes"]— bunidb pullo'zi qo'shdi: bazadaWHEREli indekslar bor (Partial indekslar), ularni ifodalash uchun preview imkoniyati kerak.datasourceda faqatprovider— URLprisma.config.tsda.
Generatsiya qilingan papka (biz ishga tushirdik): client.ts, browser.ts, enums.ts, models.ts, commonInputTypes.ts, internal/ va models/ — har model uchun alohida fayl (Vazifa.ts, Foydalanuvchi.ts …). Kanonda jami 14 fayl, 530 KB. Bu kod git'ga kirmaydi — .gitignore da src/generated/, har npm ci da qayta yasaladi.
Tekshirib ko'ring: Hamkasbingiz repo'ni klonladi,
npm ciqildi, lekinimport { PrismaClient } from "./generated/prisma/client.ts"— "fayl topilmadi". Nima bo'lgan bo'lishi mumkin?
Javob
postinstall ishlamagan: masalan npm ci --ignore-scripts bilan o'rnatgan yoki skriptlar ruxsatsiz bloklangan. Yechim — npm run db:generate ni qo'lda ishga tushirish. Shuning uchun generatsiya alohida skript sifatida ham turadi.
7. Birinchi so'rov
Endi hammasini ulaymiz. Kichik skript (biz ishga tushirdik, holat 20 bazasi, PostgreSQL 17.6):
import pg from "pg";
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "./src/generated/prisma/client.ts";
const pool = new pg.Pool({
connectionString: process.env["DATABASE_URL"],
});
const db = new PrismaClient({
adapter: new PrismaPg(pool),
log: [{ emit: "event", level: "query" }],
});
db.$on("query", (e) => console.log("SQL:", e.query));
const soni = await db.foydalanuvchi.count();
console.log("foydalanuvchilar:", soni);
const v = await db.vazifa.findFirst({
where: { egasiId: 1n },
orderBy: { tartib: "asc" },
select: { id: true, matn: true, tartib: true },
});
console.log(v);
await db.$disconnect();
await pool.end();Chiqish (SQL qatorlari qisqartirildi):
SQL: SELECT COUNT(*) AS "_count$_all" FROM (SELECT "public"."foydalanuvchilar"."id" FROM "public"."foydalanuvchilar" WHERE 1=1 OFFSET $1) AS "sub"
foydalanuvchilar: 8
SQL: SELECT "public"."vazifalar"."id", "public"."vazifalar"."matn", "public"."vazifalar"."tartib" FROM "public"."vazifalar" WHERE "public"."vazifalar"."egasi_id" = $1 ORDER BY "public"."vazifalar"."tartib" ASC LIMIT $2 OFFSET $3
{
id: 1n,
matn: "JavaScript kursining 26-qismini boshlash #o'qish",
tartib: 1
}Kuzatuvlar:
log: query— Prisma yuborgan har SQL'ni ko'rsatadi. O'rganish va xato qidirishda doim yoqing.count()ichki subquery bilanCOUNT(*)qildi — Prisma SQL'i qo'lda yozilganidan boshqacha, lekin to'g'ri.id: 1n— bigint (nqo'shimchasi). Bazadabigint, Prisma uni JSbigintqiladi (pgesa satr qilardi). Shuning uchun filtr ham1n. Bu Prisma: modellar va atributlar darsida chuqur.- Oxirida ikki yopish:
$disconnect()vapool.end()— hovuz bizniki, uni o'zimiz yopamiz.
Diqqat: Kanon ilovada
pgPool()yordamchisini (26-qism) ishlatmaydi: ubigintniNumberga aylantiradigan tur parserini qo'yadi, Prisma esabigintkutadi. Prisma uchun alohida, oddiypg.Poolyaratiladi.
8. Mavjud bazadan sxema: db pull
8.1 Introspection
Bizda baza tayyor — 26-qismdagi 14 ta va 27-qismdagi 6 ta SQL migratsiya. Prisma'ga modellarni qo'lda yozish o'rniga, uni bazadan "o'qitamiz" — introspection:
DATABASE_URL=postgres://postgres@127.0.0.1:5498/vazifalar \
npx prisma db pullKanon chiqishi (boshi):
Datasource "db": PostgreSQL database "vazifalar", schema "public" at "127.0.0.1:5498"
- Introspecting based on datasource defined in prisma\schema.prisma
✔ Introspected 6 models and wrote them into prisma\schema.prisma in 119ms6 jadval — 6 model, ustuvorlik enum'i, tashqi kalitlar — relation'lar, indekslar — @@index.
8.2 Prisma nimani ko'rmaydi
Eng qimmatli qism — ogohlantirishlar (kanon, qisqartirilgan):
These fields are not supported by Prisma Client, because Prisma currently does not support their types:
- Model: "vazifalar", field: "qidiruv", original data type: "tsvector"
These tables contain row level security, which is not yet fully supported.
These constraints are not supported by Prisma Client, because Prisma currently does not fully support check constraints.
- Model: "vazifalar", constraint: "vazifalar_matn_check"
These constraints are not supported by Prisma Client, because Prisma currently does not fully support exclusion constraints.
- Model: "vazifalar", constraint: "vazifalar_egasi_id_matn_excl"Jami: tsvector ustuni, 5 jadvaldagi RLS, 10 ta CHECK, 1 ta EXCLUDE (014), jadval izohlari (COMMENT) va 2 ta ifoda indeksi (lower(email), trigram). Bundan tashqari view, materialized view, trigger va funksiyalar haqida umuman gap yo'q — Prisma ularni ko'rmaydi.
Bu nimani anglatadi: 26–27-qismlarda bazaga qo'ygan himoyalarimizning katta qismi Prisma sxemasida yo'q. Ular bazada ishlashda davom etadi (Prisma ularni buzmaydi), lekin Prisma sxemasidan baza qayta yaratilsa, ular yo'qoladi. Shuning uchun kanon qarori: sxema manbai — SQL migratsiyalar, schema.prisma esa faqat client uchun tavsif.
8.3 Kanon topilmasi: generated ustun
qidiruv ustuni (Postgres'da full-text search) GENERATED ALWAYS AS (…) STORED. db pull uni shunday yozdi:
qidiruv Unsupported("tsvector")?
@default(dbgenerated("to_tsvector('simple'::regconfig, …)"))Bu noto'g'ri: generated ustun — DEFAULT emas. Prisma'ning migratsiya vositasi shu tavsifdan DEFAULT li DDL yasashi mumkin edi. Kanon qo'lda tuzatdi: qidiruv Unsupported("tsvector")? — @default siz, va izoh bilan. Unsupported maydon client'da umuman ko'rinmaydi.
8.4 Qo'lda tartiblash
db pull natijasi — xom: modellar jadval nomi bilan (vazifalar), maydonlar ustun nomi bilan (egasi_id). Kanon uni Prisma uslubiga keltirdi — keyingi darsning mavzusi (Prisma: modellar va atributlar): model Vazifa, maydon egasiId, bazadagi nom esa @@map("vazifalar"), @map("egasi_id") bilan saqlanadi. Bazada hech narsa o'zgarmaydi.
Tekshirib ko'ring:
db pullni ikkinchi marta ishga tushirsangiz, qo'lda tartiblangan sxema bilan nima bo'ladi?
Javob
db pull sxema faylini bazadan qayta yozadi. Hujjat bo'yicha u @map/@@map va qo'lda berilgan model nomlarini saqlashga harakat qiladi, lekin izohlar va qo'lda tuzatishlar (masalan qidiruv dagi @default olib tashlangani) qayta paydo bo'lishi mumkin. Shuning uchun db pull dan keyin git diff bilan o'zgarishni ko'ring. Kanon introspection'ni bir marta — boshlash uchun ishlatdi; keyin sxema faylni qo'lda yuritadi.
9. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
PrismaConfigEnvError: Cannot resolve environment variable: DATABASE_URL |
config'da env(), URL yo'q |
URL bo'lsagina datasource |
Cannot find module 'dotenv/config' |
init yasagan config |
dotenv o'rnatish yoki --env-file |
| generatsiya qilingan client topilmadi | postinstall ishlamagan |
npm run db:generate |
Do not know how to serialize a BigInt |
bigint id JSON.stringify da |
Number()/String() (Prisma: modellar) |
| bazadagi CHECK Prisma'da yo'q | Prisma ifodalay olmaydi | SQL migratsiyalar — sxema manbai |
db pull generated ustunni @default qildi |
introspection xatosi | qo'lda tuzatish |
10. Mashqlar
Mashqlar kurs/mashqlar/27/20-prisma-ornatish/ da. 2- va 3-mashq Node 24 da tekshirilgan (biz ishga tushirdik).
1-mashq (oson): qism va vazifa
- So'rovni SQL'ga aylantiradi — query
pgorqali bazaga yuboradi — driverdb pullvamigrateni bajaradi — -engine- Client'ni sxemadan yasaydigan buyruq —
prisma - Prisma 7 generatori nomi —
provider = ""
Yechim
- compiler — TS/WASM, Rust engine o'rniga.
- adapter —
@prisma/adapter-pg, ichidapg.Pool. - schema — CLI'ning binar qismi, ilovaga kerak emas.
- generate —
postinstallvadb:generateskriptida. - prisma-client — eski
prisma-client-jsemas.
2-mashq (o'rta): URL'ni log uchun yashirish
Ilova ishga tushganda qaysi bazaga ulanayotganini log'ga yozish foydali, lekin parol log'ga tushmasligi kerak. urlniYashir(satr) funksiyasini yozing: parol bo'lsa — *** ga almashtirsin, qolgani o'zgarmasin. URL obyektidan foydalaning.
Ishora: new URL(satr) — password xususiyatini o'zgartirish mumkin; toString() natijani qaytaradi (URL va URLSearchParams).
Yechim
function urlniYashir(satr) {
const u = new URL(satr);
if (u.password !== "") u.password = "***";
return u.toString();
}
console.log(urlniYashir(
"postgres://api:juda-maxfiy@127.0.0.1:5498/vazifalar"));
console.log(urlniYashir(
"postgres://postgres@127.0.0.1:5498/vazifalar"));Konsolda:
postgres://api:***@127.0.0.1:5498/vazifalar
postgres://postgres@127.0.0.1:5498/vazifalarParolsiz satr o'zgarmadi. postgres: kabi "maxsus bo'lmagan" sxemalarda URL ba'zi normallashtirishlarni qilmaydi — natijani ko'z bilan tekshirganimiz shuning uchun.
3-mashq (qiyin): config qachon URL so'raydi
Kanondagi prisma.config.ts mantig'ini oddiy funksiya qiling: configYasa(env) — env.DATABASE_URL bo'lsa datasource qo'shilsin, bo'lmasa yo'q. Keyin buyruqniTekshir(config, buyruq) — generate doim "ok", db pull va migrate deploy esa datasource bo'lmasa "xato: DATABASE_URL kerak" qaytarsin.
Yechim
function configYasa(env) {
const url = env.DATABASE_URL;
return {
schema: "prisma/schema.prisma",
...(url === undefined ? {} : { datasource: { url } }),
};
}
const URLsiz = ["db pull", "migrate deploy"];
function buyruqniTekshir(config, buyruq) {
if (URLsiz.includes(buyruq) && config.datasource === undefined) {
return "xato: DATABASE_URL kerak";
}
return "ok";
}
const bosh = configYasa({});
const tola = configYasa({ DATABASE_URL: "postgres://localhost/v" });
for (const b of ["generate", "db pull"]) {
console.log(b, "|", buyruqniTekshir(bosh, b), "|",
buyruqniTekshir(tola, b));
}
console.log("datasource" in bosh, "datasource" in tola);Konsolda:
generate | ok | ok
db pull | xato: DATABASE_URL kerak | ok
false true...(shart ? {} : { … }) — obyektga xususiyatni shartli qo'shish: { datasource: undefined } emas, xususiyatning o'zi yo'q ("datasource" in bosh — false). Bu farq exactOptionalPropertyTypes yoqilgan TypeScript'da muhim.
11. Loyiha qadami: holat 20 — Prisma'ni o'rnatish
Holat 20 to'rt darsda quriladi (bu dars, modellar, relation'lar va CRUD). Bu darsda — o'rnatish va config. Hali commit qilmang: commit holat 20 ning oxirgi darsida, PrismaOmbori tayyor bo'lganda.
- Paketlar («Uchta paket» bo'limidagi ikki buyruq).
package.jsonga skriptlar:"postinstall": "prisma generate","db:generate": "prisma generate". prisma.config.ts— «Kanon varianti» bo'limidagi to'liq matn.prisma/schema.prisma—db pullnatijasi; generator va datasource «schema.prisma: generator va datasource» bo'limidagidek.qidiruvning@defaultini olib tashlang. Modellarni keyingi darsda tartiblaymiz..gitignoregasrc/generated/qatorini qo'shing.eslint.config.js— generatsiya qilingan kodni lint qilmaslik:
// src/generated — prisma generate natijasi, lint qilinmaydi
{ ignores: ["dist/", "public/", "src/generated/"] },tsconfig.jsonningincludero'yxatiga"prisma.config.ts"qo'shing — config fayli ham tip tekshiruvidan o'tsin.
Tekshiruv: npm run db:generate — ✔ Generated Prisma Client (7.10.1); npm run tip va npm run lint — exit 0; npm test — oldingidek o'tadi (kod hali Prisma'ni ishlatmaydi). «Birinchi so'rov» bo'limidagi skriptni loyiha ildizida vaqtincha ishga tushirib, ulanishni tekshiring, keyin uni o'chiring.
12. Real ishda
- Prisma — Node.js'da eng ko'p yuklanadigan ORM'lardan biri; NestJS, Next.js loyihalarida tez-tez uchraydi. 7-versiyaga ko'chish — 2026-yilda ko'p jamoalarning ishi: generator, config va adapter o'zgaradi.
- Mavjud bazaga Prisma qo'shish (introspection) — real loyihalarda yangi bazadan ko'ra tez-tez uchraydi.
- Intervyuda: "Prisma qanday ishlaydi, client qayerdan keladi?", "Prisma 7 da nima o'zgardi?", "Prisma nimani qo'llamaydi va siz buni qanday hal qilasiz?"
Xulosa
- Prisma 7 = CLI (schema-engine) + generatsiya qilingan client + query compiler + driver adapter (
pg). - Generator
prisma-client— kodsrc/generatedda, git'da emas,postinstallbilan yasaladi;importFileExtension "ts"Node 24 da build'siz ishlaydi. prisma.config.ts— URL faqat bor bo'lsa: aks holdagenerateham yiqiladi;.envni Node o'qiydi.db pullmodellarni beradi, lekin CHECK, EXCLUDE, RLS, trigger, view'ni ko'rmaydi — sxema manbai SQL migratsiyalar.- Hovuz bizniki:
new PrismaPg(pool), yopish —$disconnect()vapool.end().
Keyingi dars: Prisma: modellar va atributlar — db pull natijasini tartiblaymiz: @map, @@index, BigInt, Json, DateTime va enum.
Manbalar
- Prisma ORM 7 — upgrade guide (query compiler, driver adapter,
prisma-clientgeneratori, config): https://www.prisma.io/docs/guides/upgrade-prisma-orm/v7 - Prisma config (
prisma.config.ts,env()): https://www.prisma.io/docs/orm/v7/reference/prisma-config-reference - Generators (
output,moduleFormat,importFileExtension): https://www.prisma.io/docs/orm/v7/prisma-schema/overview/generators - Introspection (
db pull) va qo'llanmaydigan imkoniyatlar: https://www.prisma.io/docs/orm/v7/prisma-schema/introspection @prisma/adapter-pg: https://www.prisma.io/docs/orm/v7/core-concepts/supported-databases/postgresql- O'qilgan sana — 2026-10-26. Kanon o'lchovi (IlmHamroh, 2026-10): holat 20 tekshiruvi, introspection ogohlantirishlari,
node_moduleshajmi. Biz ishga tushirdik (Prisma 7.10.1, Node 24.21.0, npm 11.19.0, PostgreSQL 17.6, holat 20 nusxasi):npm cichiqishi,prisma --version,prisma init,PrismaConfigEnvError, birinchi so'rov va SQL logi; 2–3-mashqlar.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!