• Mail us
  • Book a Meeting
  • Call us
  • Chat with us

NodeJS

Prisma with Nest.js: The Ultimate Guide to Efficient Database Queries


Introduction

Prisma is a modern ORM (Object-Relational Mapping) tool that simplifies database access in Node.js applications. It provides type safety, auto-generated queries, and a powerful query engine, making it an excellent choice for working with databases in Nest.js.

Why Use Prisma with Nest.js?

Nest.js applications typically use TypeORM or Sequelize for database interactions, but Prisma offers several advantages:

Type Safety – Prevents errors by enforcing strict TypeScript types.

Auto-Generated Queries – No need to write raw SQL manually.

Migrations & Schema Management – Easily modify and sync your database schema.

Supports Multiple Databases – Works with PostgreSQL, MySQL, MongoDB, and more.

Performance Optimizations – Uses a highly efficient query engine.

Installing Prisma in a Nest.js Project

First, install Prisma and the required database connector (e.g., PostgreSQL, MySQL, or SQLite).

npm install @prisma/client 

npm install --save-dev prisma

Next, initialize Prisma:

npx prisma init

This creates a prisma directory with a schema file (schema.prisma).

Configuring Prisma for Nest.js

Update schema.prisma

Edit the prisma/schema.prisma file to define your database provider and tables.

For example, using PostgreSQL:

generator client { provider = "prisma-client-js"}datasource db { provider = "postgresql" url      = env("DATABASE_URL")}model User { id        String  @id @default(uuid()) name      String email     String  @unique createdAt DateTime @default(now())}

 

Now, set up your database URL in .env:

DATABASE_URL="postgresql://user:password@localhost:5432/mydb"

Run the migration to apply changes:

npx prisma migrate dev --name init

Setting Up Prisma in Nest.js

Create a Prisma Service

Nest.js follows a modular architecture, so we create a Prisma service to manage database interactions.

Run:

nest g service prisma

Then, update prisma.service.ts:

import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';import { PrismaClient } from '@prisma/client';@Injectable()export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy { async onModuleInit() {   await this.$connect(); // Connect to database on app start } async onModuleDestroy() {   await this.$disconnect(); // Disconnect when app stops }}

Provide Prisma in the App Module

Now, register PrismaService in app.module.ts

import { Module } from '@nestjs/common';import { PrismaService } from './prisma/prisma.service';@Module({ providers: [PrismaService], exports: [PrismaService],})export class AppModule {}

 

This allows Prisma to be used in different modules across the app.

Performing Database Queries with Prisma

Now that Prisma is set up, let's create a UserService to handle database operations.

Run:

nest g service user

Then, modify user.service.ts:

import { Injectable } from '@nestjs/common';import { PrismaService } from '../prisma/prisma.service';@Injectable()export class UserService { constructor(private prisma: PrismaService) {} // Create a new user async createUser(name: string, email: string) {   return this.prisma.user.create({     data: { name, email },   }); } // Get all users async getAllUsers() {   return this.prisma.user.findMany(); } // Get a user by ID async getUserById(id: string) {   return this.prisma.user.findUnique({ where: { id } }); } // Update a user async updateUser(id: string, data: { name?: string; email?: string }) {   return this.prisma.user.update({     where: { id },     data,   }); } // Delete a user async deleteUser(id: string) {   return this.prisma.user.delete({ where: { id } }); }}

Using Prisma in a Controller

Now, let's create a UserController to expose APIs for user management.

Modify user.controller.ts:

import { Controller, Get, Post, Body, Param, Delete, Put } from '@nestjs/common';import { UserService } from './user.service';@Controller('users')export class UserController { constructor(private userService: UserService) {} @Post() createUser(@Body() data: { name: string; email: string }) {   return this.userService.createUser(data.name, data.email); } @Get() getAllUsers() {   return this.userService.getAllUsers(); } @Get(':id') getUserById(@Param('id') id: string) {   return this.userService.getUserById(id); } @Put(':id') updateUser(@Param('id') id: string, @Body() data: { name?: string; email?: string }) {   return this.userService.updateUser(id, data); } @Delete(':id') deleteUser(@Param('id') id: string) {   return this.userService.deleteUser(id); }} 

Now, you can start your Nest.js server and test the API with Postman or cURL.

Advanced Prisma Features

Using Select & Include

To fetch specific fields:

const user = await this.prisma.user.findUnique({ where: { id }, select: { name: true, email: true }, // Fetch only name & email});

 

To fetch related data:

const userWithPosts = await this.prisma.user.findUnique({ where: { id }, include: { posts: true }, // Include related posts});

 

Raw SQL Queries with Prisma

const users = await this.prisma.$queryRaw`SELECT * FROM "User" WHERE "email" LIKE '%@gmail.com'`;

 

Pagination with Prisma

const users = await this.prisma.user.findMany({ take: 10, // Limit results to 10 skip: 20, // Skip first 20 results orderBy: { createdAt: 'desc' }, // Sort by createdAt});

Key Takeaways

  • Prisma is a powerful ORM that simplifies database access in Nest.js.

  • Easy setup: Install Prisma, define your schema, and generate migrations.

  • PrismaService: A central service in Nest.js to handle database interactions.

  • CRUD Operations: Easily perform create, read, update, and delete operations.

  • Advanced Features: Supports pagination, filtering, raw SQL, and relational queries.

  • Optimized Queries: Prisma automatically generates efficient SQL queries for better performance.

Ready to transform your business with our technology solutions?   Contact us today to Leverage Our Nodejs Expertise. 

Share

facebook
LinkedIn
Twitter
Mail
NodeJS

Related Center Of Excellence