Saatnya berinteraksi dengan database! Pelajari cara men-generate Prisma Client berdasarkan skema Anda, dan bagaimana mengimpor serta menginisialisasinya di kode TypeScript/JavaScript untuk mulai melakukan query.
"Penerjemah" Canggih ke Database: Generate & Pake Prisma Client!
Udah punya "cetak biru" database di schema.prisma? Udah bisa "ngebangun" atau "ngupdate" database benerannya pake prisma migrate dev? Keren banget! Sekarang, gimana caranya biar kode aplikasi Node.js atau TypeScript kita bisa "ngobrol" sama database itu buat nyimpen, ngambil, ngubah, atau ngapus data?
Nah, di sinilah Prisma Client berperan sebagai "penerjemah" super canggih dan type-safe!
Apa Itu Prisma Client?
Prisma Client adalah sebuah query builder (pembangun query) yang di-generate otomatis oleh Prisma berdasarkan file schema.prisma-mu. Dia berupa library JavaScript/TypeScript yang bisa kamu impor dan pake di kodemu.
Kenapa dia keren?
Type-Safe Banget (Kalau Pake TypeScript):
Karena Prisma Client di-generate dari skemamu, dia tau persis model data apa aja yang kamu punya, field apa aja di tiap model, dan tipe datanya apa.
Jadi, pas kamu nulis kode buat query database pake Prisma Client di TypeScript, kamu bakal dapet auto-completion yang akurat dari Code Editor (seperti VS Code), dan TypeScript bisa ngasih tau error kalau kamu salah nulis nama field, salah ngasih tipe data, atau nyoba ngelakuin operasi yang gak valid. Ini ngurangin bug banget!
API yang Intuitif dan Modern:
Cara nulis query-nya gampang dibaca dan mirip sama cara kita mikirin data (misal, prisma.user.findMany(), prisma.post.create(...)).
Ngedukung operasi-operasi kompleks kayak filter, sorting, pagination, dan ngambil data relasi dengan gampang.
Otomatis Di-update:
Setiap kali kamu ngejalanin prisma migrate dev (atau prisma generate manual), Prisma Client bakal otomatis di-generate ulang biar selalu sinkron sama skema database terbarumu. Jadi, kalau kamu nambah field baru di skema, field itu langsung bisa diakses di Prisma Client.
Intinya, Prisma Client ini ngurusin semua keribetan nulis query SQL manual dan ngasih kita cara yang aman dan nyaman buat interaksi sama database dari kode aplikasi kita.
Sebenernya, kalau kamu udah ngejalanin npx prisma migrate dev dan berhasil, perintah ini biasanya udah otomatis ngejalanin prisma generate juga di belakang layar. Jadi, Prisma Client-mu harusnya udah paling update.
Tapi, ada baiknya kamu tau perintah manualnya. prisma generate ini bakal ngebaca schema.prisma-mu (terutama bagian generator client) dan nge-generate kode Prisma Client ke dalem folder node_modules/@prisma/client/.
Cara Jalanin Manual (Kalau Perlu):
Di terminal, di root proyekmu:
bash
npx prisma generate
Kamu perlu ngejalanin ini manual kalau misalnya:
Kamu baru aja ngubah schema.prisma tapi gak mau langsung nge-migrate database-nya, cuma mau update tipe di client.
Atau kalau ada kasus aneh di mana client-nya gak ke-update otomatis.
Output kalau berhasil biasanya kayak gini:
Environment variables loaded from .env
Prisma schema loaded from prisma/schema.prisma
✔ Generated Prisma Client (x.y.z | library) to ./node_modules/@prisma/client in XXX ms
You can now import PrismaClient in your code. // highlight-line
// highlight-start
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
// highlight-end
Perhatiin, dia ngasih tau cara impor dan pakenya!
Langkah 2: Mengimpor dan Menginisialisasi Prisma Client di Kodemu
Setelah Prisma Client di-generate, kamu bisa mulai pakenya di file TypeScript (.ts) atau JavaScript (.js) di proyekmu.
Impor PrismaClient:
Di file tempat kamu mau ngakses database, impor class PrismaClient dari package @prisma/client.
typescript
// Contoh di file server.ts atau api-handler.tsimport { PrismaClient } from '@prisma/client';
Bikin Instance (Contoh) dari PrismaClient:
Buat satu instance dari PrismaClient. Instance ini yang bakal jadi "gerbang"mu buat semua operasi database.
typescript
const prisma = new PrismaClient();
Praktik Terbaik buat Inisialisasi PrismaClient di Proyek Node.js (termasuk Next.js API Routes):
Di aplikasi Node.js, terutama yang bisa nge-handle banyak request, kamu gak mau bikin instance PrismaClient baru setiap kali ada request atau setiap kali modul diimpor ulang pas hot reloading di development. Ini bisa nyebabin terlalu banyak koneksi ke database dan boros resource.
Cara yang lebih baik adalah bikin satu instance PrismaClient global yang bisa dipake ulang di seluruh aplikasimu.
Contoh (buat file prisma/client.ts atau lib/prisma.ts):
typescript
// File: src/lib/prisma.ts (atau path yang sesuai)import { PrismaClient } from '@prisma/client';// Deklarasi variabel global untuk Prisma Client// Ini trik biar di development mode (dengan hot reloading) kita gak bikin banyak instancedeclare global { // eslint-disable-next-line no-var var prisma: PrismaClient | undefined;}const prismaClientSingleton = () => { return new PrismaClient();};const prisma = globalThis.prisma ?? prismaClientSingleton();export default prisma;if (process.env.NODE_ENV !== 'production') globalThis.prisma = prisma;
Penjelasan Kode di Atas:
declare global { ... }: Ini trik TypeScript buat nambahin properti ke objek global tanpa error.
prismaClientSingleton(): Fungsi yang cuma bikin instance PrismaClient baru.
globalThis.prisma ?? prismaClientSingleton():
globalThis.prisma: Nyoba ngambil instance prisma yang mungkin udah ada di objek global (berguna pas hot reload di development, biar gak bikin instance baru terus).
?? (Nullish Coalescing Operator): Kalau globalThis.prisma itu null atau undefined (misalnya, pas pertama kali jalan atau di produksi), baru dia manggil prismaClientSingleton() buat bikin instance baru.
if (process.env.NODE_ENV !== 'production') globalThis.prisma = prisma;: Di mode development, kita simpen instance prisma yang baru dibuat (atau yang udah ada) ke objek global lagi, biar bisa dipake ulang sama hot reloader. Di produksi, ini gak perlu.
Dengan cara ini, kamu cuma punya satu instance PrismaClient yang efisien.
Cara Pake Instance prisma yang Udah Dibikin:
Di file lain tempat kamu butuh akses database:
typescript
// Contoh di src/app/api/users/route.ts (Next.js API Route)import prisma from '@/lib/prisma'; // Impor instance prisma yang udah kita bikin// (Pastikan path '@/lib/prisma' udah bener sesuai setup alias di tsconfig.json)export async function GET(request: Request) { try { const users = await prisma.user.findMany(); // Langsung pake! // ... (return response) ... } catch (error) { // ... (handle error) ... } finally { // Di beberapa skenario (misal, skrip yang jalan sekali), kamu mungkin perlu disconnect // await prisma.$disconnect(); // Tapi di aplikasi server yang jalan terus (kayak Next.js), biasanya gak perlu disconnect manual tiap request. }}
Mulai Melakukan Query!
Setelah kamu punya instance prisma, kamu bisa langsung mulai "ngobrol" sama database-mu pake metode-metode yang udah disiapin Prisma Client.
Nama-nama model yang udah kamu definisiin di schema.prisma (misal, User, Post) bakal otomatis jadi properti di objek prisma.
prisma.user -> Buat operasi ke tabel/model User.
prisma.post -> Buat operasi ke tabel/model Post.
Dan tiap properti model itu punya banyak metode kayak findMany(), findUnique(), create(), update(), delete(), dll. yang bakal kita bahas detail di materi berikutnya.
Contoh "Ngintip" Pake findMany():
typescript
// Di dalem fungsi async, atau di top-level await (kalau environment ngedukung)async function main() { try { const semuaUser = await prisma.user.findMany(); console.log("Daftar semua user:", semuaUser); const semuaPost = await prisma.post.findMany({ include: { author: true } // Contoh ngambil post beserta info author-nya! }); console.log("Daftar semua post (dengan author):", semuaPost); } catch (e) { console.error("Error pas query:", e); } finally { await prisma.$disconnect(); // Penting buat nutup koneksi kalau ini skrip yang jalan sekali }}main();
async/await: Hampir semua operasi Prisma Client itu asinkron (karena butuh waktu buat ngobrol sama database). Jadi, kita biasanya pake async/await biar kodenya lebih gampang dibaca.
try...catch...finally: Praktik baik buat ngebungkus query database pake try...catch buat nanganin error, dan finally buat mastiin koneksi database ditutup (prisma.$disconnect()) kalau skripnya udah selesai jalan (ini lebih relevan buat skrip CLI atau task yang jalan sekali, bukan buat server API yang jalan terus).
Prisma Client ini bener-bener "game changer"! Dia ngubah cara kita interaksi sama database jadi jauh lebih modern, aman pake TypeScript, dan enak dipake. Gak perlu lagi pusing sama sintaks SQL yang beda-beda atau nulis query manual yang rawan error.
Di materi berikutnya, kita bakal fokus ngebedah berbagai operasi CRUD (Create, Read, Update, Delete) pake Prisma Client. Siap buat jadi master pengolah data?