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

Prisma 7: o'rnatish va arxitektura — driver adapter, prisma.config.ts va db pull

Qisqacha: Prisma 7 — TypeScript ORM: schema.prisma faylidagi 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 tanish pg) yuboradi. Sozlama prisma.config.ts da, generator prisma-client — client sizning src/ 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/client va @prisma/adapter-pg ni o'rnatib, nima uchun har biri kerakligini bilasiz.
  • prisma.config.ts, schema.prisma va generator sozlamalarini o'qiy olasiz.
  • Mavjud bazani db pull bilan introspection qilib, Prisma nimani ko'rmasligini bilasiz.
  • vazifalar-api ga 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 ci qilib, 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 --> DB

Diagrammada 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):

text
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     : partialIndexes

Query 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-engine binari 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

bash
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 prisma yozmang. 2026-10-27 holatida npm'dagi latest yorlig'i — 8.0.0-rc.27 (Prisma 8 ning sinov versiyasi), 7-versiya esa prev yorlig'ida. prisma.io/docs ham sukut bo'yicha Prisma 8 ni ko'rsatadi; 7-versiya hujjati — /docs/orm/v7 bo'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:

text
> 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: har npm ci dan keyin client avtomatik yasaladi (u git'da emas, quyida).
  • install-scripts ogohlantirishi — 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:

node_modules hajmi
  • 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):

bash
npx prisma init --datasource-provider postgresql

Natija (qisqartirilgan):

text
Initialized Prisma in your project

  prisma/
    schema.prisma
  prisma7.config.ts
  .env
  .gitignore
  .claude/skills/
  .windsurf/skills/
  .agents/skills/
  skills-lock.json

Ikki kutilmagan narsa:

  • Config fayli prisma7.config.ts deb nomlandi va ichida import "dotenv/config" bor — ya'ni dotenv paketini kutadi. Prisma CLI bu nomni ham taniydi (biz tekshirdik: dotenv o'rnatilmagani uchun Cannot find module 'dotenv/config' xatosi chiqdi). Kanon esa hujjatdagi prisma.config.ts nomini va dotenv siz yondashuvni ishlatadi (pastda).
  • init AI-yordamchilar uchun "skill" papkalarini ham yaratdi (.claude/, .windsurf/, .agents/). Ular loyihaga kerak bo'lmasa — o'chiring yoki .gitignore ga qo'shing; har holda git status ni 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

ts
// 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):

text
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):

json
{
  "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

ts
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 sifatida output papkasiga yoziladi.
  • output — src/generated/prisma. Kod sizning loyihangizda, node_modules ichida emas: import yo'li aniq (./generated/prisma/client.ts).
  • moduleFormat = "esm" — loyiha ESM ("type": "module", 24-qism).
  • importFileExtension = "ts" — generatsiya qilingan fayllar bir-birini .ts kengaytmasi 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: tsc strict (exactOptionalPropertyTypes, erasableSyntaxOnly) ham o'tdi.
  • previewFeatures = ["partialIndexes"] — buni db pull o'zi qo'shdi: bazada WHERE li indekslar bor (Partial indekslar), ularni ifodalash uchun preview imkoniyati kerak.
  • datasource da faqat provider — URL prisma.config.ts da.

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 ci qildi, lekin import { 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):

ts
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):

text
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 bilan COUNT(*) qildi — Prisma SQL'i qo'lda yozilganidan boshqacha, lekin to'g'ri.
  • id: 1n — bigint (n qo'shimchasi). Bazada bigint, Prisma uni JS bigint qiladi (pg esa satr qilardi). Shuning uchun filtr ham 1n. Bu Prisma: modellar va atributlar darsida chuqur.
  • Oxirida ikki yopish: $disconnect() va pool.end() — hovuz bizniki, uni o'zimiz yopamiz.

Diqqat: Kanon ilovada pgPool() yordamchisini (26-qism) ishlatmaydi: u bigint ni Number ga aylantiradigan tur parserini qo'yadi, Prisma esa bigint kutadi. Prisma uchun alohida, oddiy pg.Pool yaratiladi.

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:

bash
DATABASE_URL=postgres://postgres@127.0.0.1:5498/vazifalar \
  npx prisma db pull

Kanon chiqishi (boshi):

text
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 119ms

6 jadval — 6 model, ustuvorlik enum'i, tashqi kalitlar — relation'lar, indekslar — @@index.

8.2 Prisma nimani ko'rmaydi

Eng qimmatli qism — ogohlantirishlar (kanon, qisqartirilgan):

text
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:

ts
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 pull ni 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
  • pg orqali bazaga yuboradi — driver
  • db pull va migrate ni 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, ichida pg.Pool.
  • schema — CLI'ning binar qismi, ilovaga kerak emas.
  • generate — postinstall va db:generate skriptida.
  • prisma-client — eski prisma-client-js emas.

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
js
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:

text
postgres://api:***@127.0.0.1:5498/vazifalar
postgres://postgres@127.0.0.1:5498/vazifalar

Parolsiz 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
js
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:

text
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.

  1. Paketlar («Uchta paket» bo'limidagi ikki buyruq). package.json ga skriptlar: "postinstall": "prisma generate", "db:generate": "prisma generate".
  2. prisma.config.ts — «Kanon varianti» bo'limidagi to'liq matn.
  3. prisma/schema.prisma — db pull natijasi; generator va datasource «schema.prisma: generator va datasource» bo'limidagidek. qidiruv ning @default ini olib tashlang. Modellarni keyingi darsda tartiblaymiz.
  4. .gitignore ga src/generated/ qatorini qo'shing.
  5. eslint.config.js — generatsiya qilingan kodni lint qilmaslik:
js
// src/generated — prisma generate natijasi, lint qilinmaydi
{ ignores: ["dist/", "public/", "src/generated/"] },
  1. tsconfig.json ning include ro'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 — kod src/generated da, git'da emas, postinstall bilan yasaladi; importFileExtension "ts" Node 24 da build'siz ishlaydi.
  • prisma.config.ts — URL faqat bor bo'lsa: aks holda generate ham yiqiladi; .env ni Node o'qiydi.
  • db pull modellarni beradi, lekin CHECK, EXCLUDE, RLS, trigger, view'ni ko'rmaydi — sxema manbai SQL migratsiyalar.
  • Hovuz bizniki: new PrismaPg(pool), yopish — $disconnect() va pool.end().

Keyingi dars: Prisma: modellar va atributlar — db pull natijasini tartiblaymiz: @map, @@index, BigInt, Json, DateTime va enum.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Prisma 7: o'rnatish va arxitektura — driver adapter, prisma.config.ts va db pull — IlmHamroh