Prisma adalah ORM modern untuk ekosistem JavaScript/TypeScript. Anda mendeskripsikan model data pada schema.prisma, melakukan migrasi skema ke database, lalu memakai Prisma Client (type-safe) untuk membaca/menulis data dari kode aplikasi. Pada bagian akhir, Anda juga akan mencoba Prisma Studio untuk menjelajah data secara visual selama pengembangan.
- Prasyarat
- Inisialisasi Proyek & Prisma
- Menyusun Skema (schema.prisma)
- Migrasi Skema ke Database
- Kueri Dasar dengan Prisma Client
- Mengecek Data via Prisma Studio
- Opsi Produksi (PostgreSQL)
- Troubleshooting Ringkas
- Kesimpulan
- Sumber/Referensi
Prasyarat
- Node.js & npm terpasang.
- Koneksi internet untuk mengunduh dependensi.
- Terminal/PowerShell (boleh WSL/macOS/Linux/Windows).
Inisialisasi Proyek & Prisma
Langkah berikut membuat proyek Node minimal, memasang Prisma dan Prisma Client, lalu melakukan inisialisasi.
Copy
mkdir prisma-hello
cd prisma-hello
npm init -y
npm install prisma @prisma/client
npx prisma init --datasource-provider sqlitePerintah di atas menghasilkan folder prisma/ dan berkas .env dengan koneksi SQLite default (file:./dev.db), serta kerangka schema.prisma.
Menyusun Skema (schema.prisma)
Kita buat model sederhana: User dan Post (relasi satu->banyak). Simpan isi berikut ke prisma/schema.prisma.
prisma/schema.prismaCopy
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL") // default: file:./dev.db
}
model User {
id String @id @default(cuid())
email String @unique
name String
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id String @id @default(cuid())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([authorId], map: "idx_post_author")
}Migrasi Skema ke Database
Jalankan migrasi untuk menyinkronkan skema ke database dan mengenerate Prisma Client.
Copy
npx prisma migrate dev --name init_schemaPerintah ini membuat folder prisma/migrations/ berisi SQL yang diterapkan ke database lokal. Setelah sukses, Prisma Client siap dipakai.
Query Dasar dengan Prisma Client
Buat berkas src/app.ts, lalu isi dengan contoh CRUD sederhana berikut:
src/app.tsCopy
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
// Buat user
const alice = await prisma.user.create({
data: { email: "alice@example.com", name: "Alice" },
});
// Buat beberapa post milik Alice
await prisma.post.createMany({
data: [
{ title: "Halo Prisma", content: "Memulai dengan Prisma.", authorId: alice.id, published: true },
{ title: "Konsep Skema", content: "Model, relasi, migrasi.", authorId: alice.id }
]
});
// Baca post terbit terbaru
const recent = await prisma.post.findMany({
where: { published: true },
orderBy: { createdAt: "desc" },
take: 10,
include: { author: { select: { email: true, name: true } } }
});
console.log("Post terbit:", recent);
// Update satu post
const first = recent[0];
if (first) {
const updated = await prisma.post.update({
where: { id: first.id },
data: { title: first.title + " (diperbarui)" }
});
console.log("Diupdate:", updated.id);
}
// Hapus post yang belum diterbitkan
const removed = await prisma.post.deleteMany({ where: { published: false } });
console.log("Dihapus:", removed.count, "post draft");
}
main()
.catch((e) => { console.error(e); process.exit(1); })
.finally(async () => { await prisma.$disconnect(); });Jalankan contoh di atas:
Copy
npm install -D typescript ts-node
npx ts-node src/app.tsMengecek Data via Prisma Studio
Selama pengembangan, Anda bisa mengecek isi tabel melalui antarmuka visual berikut.
Copy
npx prisma studioKeamanan: Prisma Studio ditujukan untuk lingkungan lokal/pengembangan. Jangan mempublikasikannya ke internet publik.Opsi Produksi (PostgreSQL)
Untuk produksi, ubah datasource menjadi postgresql dan sesuaikan .env. Berikut contoh singkat:
prisma/schema.prisma (cuplikan)Copy
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}File: .env (contoh)Copy
DATABASE_URL="postgresql://USER:PASS@HOST:5432/DBNAME?schema=public"Copy
npx prisma migrate dev --name init_pgLangkah query dan Studio sama seperti pada SQLite. Di tahap produksi, pertimbangkan connection pooling (mis. pgbouncer), indeks yang tepat, serta strategi backup/restore.
Troubleshooting Ringkas
- Gagal konek DB — Periksa
DATABASE_URL, hak akses jaringan, dan status layanan DB. - Migrasi gagal — Tinjau folder
prisma/migrations/, pastikan skema konsisten; jalankan ulang setelah koreksi. - Type error saat kueri — Pastikan
@prisma/clientterpasang dan client telah digenerate (terjadi otomatis saat install). - Studio tidak muncul — Pastikan port tidak bentrok; coba parametrik
--port(mis.npx prisma studio --port 5555).
Kesimpulan
Itu saja! Anda telah: inisialisasi proyek, menulis skema, menjalankan migrasi, menulis kueri CRUD, dan membuka Studio. Selanjutnya, Anda bisa menambah relasi lebih kompleks, menulis seeding, serta mengintegrasikan dengan framework favorit (Express/Next/Nest). Prisma menjaga konsistensi tipe dari skema hingga kode—kombinasi yang menyenangkan untuk tim modern.
Sumber/Referensi
- Prisma — Get started
- Quickstart: TypeScript & SQLite
- Prisma Schema Overview
- Prisma Client
- Migrate: Development & Production
- Prisma Studio
- Start from scratch (PostgreSQL)
.refs li{margin-left:18px}
/* Code blocks */
.codebox{margin:10px 0}
.codehead{display:flex;justify-content:space-between;align-items:center;background:var(--soft);border:1px solid #e2e8f0;border-bottom:none;border-radius:10px 10px 0 0;padding:8px 10px;font-size:14px;color:var(--ink-2)}
pre{background:var(--bg);color:var(--fg);border:1px solid var(--line);border-radius:10px;padding:12px;overflow:auto;margin:0}
code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:14px;white-space:pre}
.copy{float:right;margin-left:auto;margin-bottom:6px;padding:6px 10px;border-radius:8px;border:1px solid var(--muted);background:#f8fafc;cursor:pointer}
.copy:disabled{opacity:.6;cursor:not-allowed}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.