Installation
This guide covers how to install Prisma and integrate it into your NestJS application. You have two main options for integration: using the nestjs-prisma library or copying PrismaService into your project.
Prerequisites
Section titled “Prerequisites”First, setup Prisma in your project and select an adapter for your database.
-
Install the required Prisma dependencies:
Terminal window npm install prisma dotenv --save-devnpm install @prisma/clientTerminal window pnpm add -D prisma dotenvpnpm add @prisma/clientTerminal window yarn add -D prisma dotenvyarn add @prisma/client -
Prisma v7+ requires a database driver to be installed for your chosen database.
Terminal window npm install @prisma/adapter-pg pgnpm install @types/pg --save-devTerminal window pnpm add @prisma/adapter-pg pgpnpm add -D @types/pgTerminal window yarn add @prisma/adapter-pg pgyarn add -D @types/pgTerminal window npm install @prisma/adapter-mariadbTerminal window pnpm add @prisma/adapter-mariadbTerminal window yarn add @prisma/adapter-mariadbTerminal window npm install @prisma/adapter-better-sqlite3npm install @types/better-sqlite3 --save-devTerminal window pnpm add @prisma/adapter-better-sqlite3pnpm add -D @types/better-sqlite3Terminal window yarn add @prisma/adapter-better-sqlite3yarn add -D @types/better-sqlite3 -
Initialize Prisma with the following command:
Terminal window npx prisma init --datasource-provider postgresql --output ../src/generated/prismaTerminal window pnpm prisma init --datasource-provider postgresql --output ../src/generated/prismaTerminal window yarn prisma init --datasource-provider postgresql --output ../src/generated/prismaTerminal window npx prisma init --datasource-provider mysql --output ../src/generated/prismaTerminal window pnpm prisma init --datasource-provider mysql --output ../src/generated/prismaTerminal window yarn prisma init --datasource-provider mysql --output ../src/generated/prismaTerminal window npx prisma init --datasource-provider sqlite --output ../src/generated/prismaTerminal window pnpm prisma init --datasource-provider sqlite --output ../src/generated/prismaTerminal window yarn prisma init --datasource-provider sqlite --output ../src/generated/prismaThis command creates the following files:
Directoryprisma
- schema.prisma schema models
- .env add to .gitignore
- prisma.config.ts Prisma configuration
-
Configure the
DATABASE_URLin.envto match your database. -
Add a data model in
prisma/schema.prisma. For example, aUsermodel:model User {id String @id @default(cuid())email String @uniquename String?} -
Create and apply the first Prisma migration and generate the Prisma Client.
Terminal window npx prisma migrate dev --name initnpx prisma generateTerminal window pnpm prisma migrate dev --name initpnpm prisma generateTerminal window yarn prisma migrate dev --name inityarn prisma generate -
Add
import 'dotenv/config';to yoursrc/main.tsfile to ensureDATABASE_URL(environment variablesprocess.env) is loaded.src/main.ts import 'dotenv/config';import { NestFactory } from '@nestjs/core';import { AppModule } from './app.module';async function bootstrap() {const app = await NestFactory.create(AppModule);await app.listen(process.env.PORT ?? 3000);}bootstrap();
Option 1: Use Library
Section titled “Option 1: Use Library”The nestjs-prisma library simplifies the usage of Prisma within NestJS applications and provides additional features.
-
Install dependencies
Install
nestjs-prisma:Terminal window npm install nestjs-prisma@0.28.0-dev.0Terminal window pnpm add nestjs-prisma@0.28.0-dev.0Terminal window yarn add nestjs-prisma@0.28.0-dev.0 -
Create Prisma Client Instance
Create a
prisma-client.tsfile and create an instance of the Prisma Client.src/prisma-client.ts import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';import { Prisma, PrismaClient } from './generated/prisma/client';const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL! });export const prismaClient = new PrismaClient({ adapter });export type BasePrismaClient = typeof prismaClient; -
Configure the Module
Configure the
PrismaModulein yourAppModuleimports and importprismaClientfromprisma-client.ts.src/app.module.ts import { Module } from '@nestjs/common';import { PrismaModule } from 'nestjs-prisma';import { prismaClient } from './prisma-client';@Module({imports: [PrismaModule.forRootAsync({isGlobal: true,name: 'PrismaService', // 👈 must be unique for each PrismaClientuseFactory: () => {return prismaClient;},}),],})export class AppModule {} -
Usage
Inject
PrismaServiceproviding theBasePrismaClienttype from step 2.src/app.service.ts import { Inject, Injectable } from '@nestjs/common';import { PrismaService } from 'nestjs-prisma';import type { BasePrismaClient } from './prisma-client';@Injectable()export class AppService {constructor(@Inject('PrismaService') // 👈 use unique name to reference// Use `BasePrismaClient` for correct type-safetyprivate prisma: PrismaService<BasePrismaClient>,) {}users() {// access prisma.client.* for your queriesreturn this.prisma.client.user.findMany();}}
Option 2: Copy Code
Section titled “Option 2: Copy Code”If you prefer to manually integrate Prisma without an additional library, you can create your own PrismaService.
-
Create Files
Create
src/prisma/directory withprisma.module.tsandprisma.service.ts.Directorysrc
Directoryprisma
- prisma.module.ts
- prisma.service.ts
-
Prisma Service
Add the following code to
src/prisma/prisma.service.ts:src/prisma/prisma.service.ts import { Injectable } from '@nestjs/common';import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';import { PrismaClient } from '../generated/prisma/client';@Injectable()export class PrismaService extends PrismaClient {constructor() {const adapter = new PrismaBetterSqlite3({ url: process.env.DATABASE_URL! });super({ adapter });}} -
Prisma Module
Add the following code to
src/prisma/prisma.module.ts:src/prisma/prisma.module.ts import { Global, Module } from '@nestjs/common';import { PrismaService } from './prisma.service';@Global()@Module({providers: [PrismaService],exports: [PrismaService],})export class PrismaModule {}And import
PrismaModuleinAppModule.src/app.module.ts import { Module } from '@nestjs/common';import { PrismaModule } from './prisma/prisma.module';@Module({imports: [PrismaModule],})export class AppModule {} -
Usage
Inject
PrismaServiceinto your controllers or services.src/app.service.ts @Injectable()export class AppService {constructor(private prisma: PrismaService) {}users() {// access prisma.* for your queriesreturn this.prisma.user.findMany();}}