Ketika kamu sudah nyaman menulis TypeScript dan mulai membangun API dengan Node.js dan Express, satu hal yang cepat terasa menyakitkan adalah mengelola database: menulis query SQL mentah, menyinkronkan tipe data, dan rawan typo di nama kolom. Prisma ORM hadir untuk menyelesaikan masalah itu. Di tutorial ini kamu akan belajar Prisma dari nol — mulai dari mendefinisikan schema, menjalankan migrasi, sampai melakukan operasi CRUD yang sepenuhnya type-safe dengan TypeScript.
Apa Itu Prisma ORM?
Prisma adalah Object-Relational Mapping (ORM) modern untuk Node.js dan TypeScript. Sama seperti SQLAlchemy di Python, Prisma membiarkanmu bekerja dengan database lewat objek dan fungsi, bukan menulis SQL mentah secara manual. Bedanya, Prisma punya Prisma Client yang dibuat otomatis dari schema dan diketik penuh — sehingga editor seperti VS Code bisa melakukan autocomplete dan mendeteksi kesalahan tipe sebelum kode dijalankan.
Prisma terdiri dari tiga komponen utama: Prisma Schema (tempat kamu mendefinisikan model data), Prisma Migrate (alat untuk membuat dan menerapkan migrasi database), dan Prisma Client (query builder type-safe yang dipakai di kode aplikasi). Ketiganya bekerja sama untuk membuat alur kerja database menjadi lebih cepat dan aman.
Prisma vs SQL mentah: Prisma tidak sepenuhnya menggantikan SQL — di balik layar ia tetap menghasilkan query SQL. Keuntungan utamanya adalah keamanan tipe, autocomplete, dan kemudahan refactor. Untuk query yang sangat kompleks, Prisma juga menyediakan metode queryRaw agar kamu tetap bisa menulis SQL langsung.
Kenapa Memilih Prisma?
Ada banyak ORM di ekosistem JavaScript, tapi Prisma menonjol karena beberapa alasan. Pertama, type safety — Prisma Client di-generate berdasarkan schema sehingga setiap query yang salah tipe langsung terdeteksi. Kedua, developer experience — autocomplete lengkap di VS Code untuk nama model, field, dan relasi. Ketiga, migrasi yang mudah — Prisma Migrate otomatis membuat file migrasi SQL yang bisa di-review dan di-versioning lewat Git. Terakhir, Prisma mendukung banyak database populer seperti PostgreSQL, MySQL, SQLite, dan MongoDB.
Persiapan Proyek
Sebelum mulai, pastikan kamu sudah punya Node.js versi 18 ke atas dan npm terpasang. Kita akan menggunakan SQLite di tutorial ini karena tidak butuh server terpisah, sehingga kamu bisa langsung fokus ke Prisma-nya tanpa repot menyiapkan database.
# Buat folder proyek baru
mkdir belajar-prisma && cd belajar-prisma
# Inisialisasi proyek Node.js dan TypeScript
npm init -y
npm install --save-dev typescript ts-node @types/node
npx tsc --init
Menginstal Prisma
Setelah proyek siap, instal Prisma. Ada dua paket: prisma (CLI untuk migrasi, generate, dan studio) serta @prisma/client (query builder yang dipakai di kode aplikasi).
npm install @prisma/client
npm install --save-dev prisma
npx prisma init --datasource-provider sqlite
Perintah prisma init akan membuat dua hal: folder prisma/ berisi file schema.prisma, dan file .env berisi variabel DATABASE_URL yang menunjuk ke file SQLite. Buka file prisma/schema.prisma, isinya kurang lebih seperti ini:
Menulis Schema Prisma
File schema.prisma adalah jantung dari Prisma — di sinilah kamu mendeskripsikan struktur data aplikasi. Kita akan membuat dua model sederhana: User dan Post, dengan relasi satu User punya banyak Post (one-to-many).
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String
posts Post[]
createdAt DateTime @default(now())
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
createdAt DateTime @default(now())
}
Beberapa hal penting di schema di atas: @id menandai primary key, @default(autoincrement()) membuat nilai id bertambah otomatis, @unique memastikan email tidak duplikat, dan tanda tanya pada content (String?) berarti kolom itu boleh kosong (nullable). Relasi dideklarasikan lewat field author yang memakai @relation, dengan authorId sebagai foreign key, serta posts di sisi User sebagai penanda relasi one-to-many.
Menjalankan Migrasi Database
Setelah schema selesai ditulis, waktunya membuat tabel di database. Jalankan perintah migrasi berikut — Prisma akan membuat file migrasi SQL sekaligus menerapkannya ke database SQLite kamu.
npx prisma migrate dev --name init
migrate dev vs db push: migrate dev membuat file migrasi yang bisa di-commit ke Git dan di-replay di environment lain (sangat penting untuk tim). Sementara db push hanya menyinkronkan schema ke database tanpa menyimpan riwayat migrasi — cocok untuk prototipe cepat, tapi tidak disarankan untuk produksi.
Melakukan Operasi CRUD dengan Prisma Client
Sekarang bagian paling seru: memakai Prisma Client di kode TypeScript. Buat file baru bernama script.ts lalu tulis kode berikut, yang mendemonstrasikan operasi create, read, update, dan delete (CRUD).
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
async function main() {
// CREATE — menambahkan user baru
const user = await prisma.user.create({
data: {
email: "budi@example.com",
name: "Budi Santoso",
},
});
console.log("User dibuat:", user);
// CREATE — menambahkan post untuk user tersebut
await prisma.post.create({
data: {
title: "Post pertama saya",
content: "Halo dunia!",
authorId: user.id,
},
});
// READ — mengambil semua user beserta post-nya
const users = await prisma.user.findMany({
include: { posts: true },
});
console.log("Semua user:", users);
// UPDATE — mengubah nama user
const updated = await prisma.user.update({
where: { id: user.id },
data: { name: "Budi Santoso (updated)" },
});
console.log("User diupdate:", updated);
// DELETE — menghapus user
await prisma.user.delete({ where: { id: user.id } });
console.log("User dihapus");
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
Perhatikan bahwa semua argumen query — seperti data, where, dan include — sudah diketik penuh. Kalau kamu salah menulis nama field, TypeScript akan langsung menolaknya saat kompilasi, bukan saat runtime. Jalankan skripnya dengan:
npx ts-node script.ts
Kalau berjalan lancar, kamu akan melihat output user yang berhasil dibuat, dibaca, diupdate, lalu dihapus. Inilah kekuatan utama Prisma: query yang aman dan jelas tanpa perlu menulis SQL manual.
Relasi Antar Tabel (One-to-Many)
Prisma membuat operasi relasi menjadi sangat mudah lewat nested writes. Kamu bisa membuat user sekaligus dengan post-nya dalam satu panggilan, lalu membacanya kembali dengan include.
// Membuat user beserta dua post sekaligus (nested create)
const user = await prisma.user.create({
data: {
email: "siti@example.com",
name: "Siti Aminah",
posts: {
create: [
{ title: "Belajar Prisma", content: "ORM yang keren" },
{ title: "Tips TypeScript", published: true },
],
},
},
include: { posts: true },
});
console.log(user);
Dengan include, post yang terkait langsung ikut terambil dalam satu query. Prisma menerjemahkan ini menjadi SQL dengan join yang efisien, sehingga kamu tidak perlu melakukan N+1 query secara manual.
Menjelajah Data dengan Prisma Studio
Prisma juga menyediakan GUI bernama Prisma Studio untuk melihat dan mengedit data langsung dari browser, tanpa menulis query apa pun.
npx prisma studio
Perintah ini akan membuka antarmuka di http://localhost:5555. Di sana kamu bisa menjelajahi tabel User dan Post, menambah baris, mengedit, bahkan melihat relasi antar data secara visual. Ini sangat membantu saat development dan debugging.
Mengganti Database ke PostgreSQL
Salah satu kelebihan Prisma adalah kemudahan berganti database. Kamu hanya perlu mengubah bagian datasource di schema dan nilai DATABASE_URL — tanpa mengubah logika query di kode sama sekali. Misalnya untuk PostgreSQL (pelajari dasarnya di panduan PostgreSQL):
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
# .env
DATABASE_URL="postgresql://user:password@localhost:5432/bengkelkode?schema=public"
# Terapkan migrasi ke database PostgreSQL
npx prisma migrate dev --name init
Hati-hati di produksi: Jangan pernah menjalankan migrate dev pada database produksi — ia dirancang untuk development dan bisa memicu reset data. Untuk produksi, gunakan prisma migrate deploy yang hanya menerapkan migrasi yang sudah di-commit tanpa memodifikasi schema secara langsung.
Kesimpulan
Prisma ORM menghadirkan cara modern, aman, dan menyenangkan untuk mengelola database di proyek Node.js/TypeScript. Kamu sudah belajar mendefinisikan schema, menjalankan migrasi, melakukan CRUD, mengelola relasi, hingga mengganti database. Langkah berikutnya, coba integrasikan Prisma ke dalam API Express milikmu. Selamat mencoba!