This document describes how to integrate Prisma, a modern type-safe database client, with NestJS applications. Prisma provides an alternative to traditional ORMs with a focus on developer experience and compile-time type safety.
For SQL database integration using TypeORM, see TypeORM Integration. For MongoDB integration using Mongoose, see Mongoose Integration. For GraphQL schema generation that works with Prisma, see Code-First Approach and Schema-First Approach.
Prisma is a next-generation database toolkit that includes a type-safe query builder (Prisma Client), a migration system (Prisma Migrate), and a database browser (Prisma Studio). Unlike TypeORM, Sequelize, and Mongoose, which have dedicated NestJS wrapper packages (@nestjs/typeorm, @nestjs/sequelize, @nestjs/mongoose), Prisma is integrated directly into NestJS applications without a first-party adapter package.
| Feature | Description |
|---|---|
| Type Safety | Auto-generated TypeScript types from database schema |
| Schema-First | Database schema defined in declarative Prisma schema language |
| Query Builder | Fluent API for constructing type-safe database queries |
| Migration System | Built-in migration generation and management |
| Multi-Database Support | PostgreSQL, MySQL, SQLite, SQL Server, MongoDB, CockroachDB |
The primary Prisma sample application demonstrates GraphQL integration using the code-first approach with Apollo Server sample/22-graphql-prisma/package.json22-37
Sources: sample/22-graphql-prisma/package.json1-67 sample/33-graphql-mercurius/package.json21-33
Prisma integration in NestJS follows a service-based pattern where a PrismaService wraps the Prisma Client and is injected throughout the application.
Diagram: Prisma Integration Architecture
The architecture consists of three main layers:
schema.prisma file defines data models, relations, and database configuration.PrismaService class extends the generated client and provides lifecycle management.Sources: sample/22-graphql-prisma/package.json22-37 sample/22-graphql-prisma/package.json57
The Prisma integration requires three key packages:
Diagram: Prisma Package Dependencies
| Package | Version | Purpose | Type |
|---|---|---|---|
@prisma/client | 7.8.0 | Runtime query client with generated types sample/22-graphql-prisma/package.json30 | Runtime |
@prisma/adapter-better-sqlite3 | 7.8.0 | SQLite database adapter sample/22-graphql-prisma/package.json29 | Runtime |
prisma | ^7.0.0 | CLI for schema management and codegen sample/22-graphql-prisma/package.json57 | Development |
The @prisma/adapter-* packages provide database-specific implementations. The sample application uses SQLite via the better-sqlite3 adapter sample/22-graphql-prisma/package.json29
Sources: sample/22-graphql-prisma/package.json29-30 sample/22-graphql-prisma/package.json57
The standard integration pattern involves creating a PrismaService that extends PrismaClient and implements NestJS lifecycle hooks for connection management.
Diagram: PrismaService Lifecycle
The PrismaService typically implements:
onModuleInit(): Called during module initialization to establish database connection using $connect().onModuleDestroy(): Called during module destruction to gracefully close connection using $disconnect().PrismaClient: Inherits all generated query methods (user.findMany(), post.create(), etc.).This service is then registered as a provider in a PrismaModule and exported for use throughout the application.
Sources: sample/22-graphql-prisma/package.json22-37
Prisma uses a declarative schema file (schema.prisma) to define the database structure. The schema is then used to generate both database migrations and the TypeScript client.
Diagram: Schema-to-Code Generation Flow
The sample application includes a dedicated script for generating TypeScript types:
| Script | Command | Purpose |
|---|---|---|
generate:typings | ts-node generate-typings.ts | Generates GraphQL TypeScript definitions sample/22-graphql-prisma/package.json9 |
This script works in conjunction with Prisma-generated database types to provide end-to-end type safety from database to API.
Sources: sample/22-graphql-prisma/package.json9 sample/22-graphql-prisma/package.json61-62
The primary Prisma sample demonstrates integration with GraphQL using Apollo Server and NestJS GraphQL module.
Diagram: Prisma + GraphQL Integration Stack
| Package | Version | Purpose |
|---|---|---|
@apollo/server | 5.5.1 | GraphQL server implementation sample/22-graphql-prisma/package.json23 |
@nestjs/graphql | 13.4.2 | NestJS GraphQL module sample/22-graphql-prisma/package.json27 |
@nestjs/apollo | 13.4.2 | Apollo Server integration sample/22-graphql-prisma/package.json24 |
class-transformer | 0.5.1 | Object transformation sample/22-graphql-prisma/package.json31 |
class-validator | 0.15.1 | Decorator-based validation sample/22-graphql-prisma/package.json32 |
Sources: sample/22-graphql-prisma/package.json23-32
Prisma supports multiple database providers through adapter packages. The sample application uses SQLite with the Better SQLite3 adapter sample/22-graphql-prisma/package.json29
Diagram: Database Adapter Architecture
The adapter is specified in the datasource block of schema.prisma. The Better SQLite3 adapter provides high-performance synchronous API access sample/22-graphql-prisma/package.json29
Sources: sample/22-graphql-prisma/package.json29-30
Unlike TypeORM, Sequelize, and Mongoose, Prisma does not have a dedicated NestJS wrapper package.
| ORM | NestJS Package | Integration Pattern | Type Generation |
|---|---|---|---|
| TypeORM | @nestjs/typeorm | Decorator-based entities | Metadata reflection |
| Sequelize | @nestjs/sequelize | Model classes | Decorator metadata |
| Mongoose | @nestjs/mongoose | Schema definitions | Schema inference |
| Prisma | None (direct) | Manual service creation | CLI code generation |
Prisma's approach trades convenience for explicit control and stronger type safety through build-time code generation rather than runtime reflection.
Sources: sample/22-graphql-prisma/package.json22-37 sample/33-graphql-mercurius/package.json21-33
The repository includes a complete GraphQL + Prisma sample application.
Diagram: Sample Application Structure
| Script | Command | Purpose |
|---|---|---|
prebuild | rimraf dist | Clean build directory sample/22-graphql-prisma/package.json7 |
build | nest build | Compile application sample/22-graphql-prisma/package.json8 |
generate:typings | ts-node generate-typings.ts | Generate GraphQL definitions sample/22-graphql-prisma/package.json9 |
start:dev | nest start --watch | Start development server sample/22-graphql-prisma/package.json12 |
Sources: sample/22-graphql-prisma/package.json6-21
The Prisma sample includes tools for code generation and type manipulation:
| Package | Version | Purpose |
|---|---|---|
prisma | ^7.0.0 | CLI for schema management sample/22-graphql-prisma/package.json57 |
ts-morph | 28.0.0 | TypeScript AST manipulation sample/22-graphql-prisma/package.json61 |
ts-node | 10.9.2 | TypeScript execution sample/22-graphql-prisma/package.json62 |
Sources: sample/22-graphql-prisma/package.json57-62
The sample application includes Jest configuration for unit and integration testing:
| Configuration | Value | Purpose |
|---|---|---|
moduleFileExtensions | ["js", "json", "ts"] | Supported extensions sample/12-graphql-schema-first/package.json62-66 |
rootDir | "src" | Source directory sample/12-graphql-schema-first/package.json67 |
testRegex | ".spec.ts$" | Test file pattern sample/12-graphql-schema-first/package.json68 |
transform | "^.+\\.(t|j)s$": "ts-jest" | TypeScript transformer sample/12-graphql-schema-first/package.json70 |
testEnvironment | "node" | Execution environment sample/12-graphql-schema-first/package.json90 |
Sources: sample/12-graphql-schema-first/package.json61-91 sample/22-graphql-prisma/package.json16-19
Refresh this wiki