Skip to content

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.

First, setup Prisma in your project and select an adapter for your database.

  1. Install the required Prisma dependencies:

    Terminal window
    npm install prisma dotenv --save-dev
    npm install @prisma/client
  2. Prisma v7+ requires a database driver to be installed for your chosen database.

    Terminal window
    npm install @prisma/adapter-pg pg
    npm install @types/pg --save-dev
  3. Initialize Prisma with the following command:

    Terminal window
    npx prisma init --datasource-provider postgresql --output ../src/generated/prisma

    This command creates the following files:

    • Directoryprisma
      • schema.prisma schema models
    • .env add to .gitignore
    • prisma.config.ts Prisma configuration
  4. Configure the DATABASE_URL in .env to match your database.

  5. Add a data model in prisma/schema.prisma. For example, a User model:

    model User {
    id String @id @default(cuid())
    email String @unique
    name String?
    }
  6. Create and apply the first Prisma migration and generate the Prisma Client.

    Terminal window
    npx prisma migrate dev --name init
    npx prisma generate
  7. Add import 'dotenv/config'; to your src/main.ts file to ensure DATABASE_URL (environment variables process.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();

The nestjs-prisma library simplifies the usage of Prisma within NestJS applications and provides additional features.

  1. Install dependencies

    Install nestjs-prisma:

    Terminal window
    npm install nestjs-prisma@0.28.0-dev.0
  2. Create Prisma Client Instance

    Create a prisma-client.ts file 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;
  3. Configure the Module

    Configure the PrismaModule in your AppModule imports and import prismaClient from prisma-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 PrismaClient
    useFactory: () => {
    return prismaClient;
    },
    }),
    ],
    })
    export class AppModule {}
  4. Usage

    Inject PrismaService providing the BasePrismaClient type 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-safety
    private prisma: PrismaService<BasePrismaClient>,
    ) {}
    users() {
    // access prisma.client.* for your queries
    return this.prisma.client.user.findMany();
    }
    }

If you prefer to manually integrate Prisma without an additional library, you can create your own PrismaService.

  1. Create Files

    Create src/prisma/ directory with prisma.module.ts and prisma.service.ts.

    • Directorysrc
      • Directoryprisma
        • prisma.module.ts
        • prisma.service.ts
  2. 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 });
    }
    }
  3. 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 PrismaModule in AppModule.

    src/app.module.ts
    import { Module } from '@nestjs/common';
    import { PrismaModule } from './prisma/prisma.module';
    @Module({
    imports: [PrismaModule],
    })
    export class AppModule {}
  4. Usage

    Inject PrismaService into your controllers or services.

    src/app.service.ts
    @Injectable()
    export class AppService {
    constructor(private prisma: PrismaService) {}
    users() {
    // access prisma.* for your queries
    return this.prisma.user.findMany();
    }
    }