nestjs-prisma
Advanced

Rust-free and driver adapter

Rust-free Prisma Client is Generally Available with v6.16.0.

Learn how to use the new prisma-client provider with a custom output path and adapter driver. For more information see the No Rust engine guide on Prisma docs.

Make sure you have prisma and @prisma/client v6.16.0 or later installed.

Configure Rust-free Prisma Client

Configure your Prisma schema to use the new prisma-client provider and set a output directory. You can include the output directory in git, because it doesn’t contain the rust query engine binary.

// prisma/schema.prisma
generator client {
  provider     = "prisma-client"
  output       = "../src/generated/prisma"
  engineType   = "client"
  runtime      = "nodejs"
  moduleFormat = "cjs"
}

datasource db {
  provider = "sqlite"
  url      = "file:dev.db"
}

Read more about additional fields for the prisma-client provider.

Add your models to the schema.prisma, run npx prisma generate and run the prisma migration npx prisma migrate dev.

Prisma config (optional)

Add at the root level the prisma.config.ts to configure the Prisma CLI for commands like migrate, seed.

// prisma.config.ts
import path from 'node:path';
import { defineConfig } from 'prisma/config';

export default defineConfig({
  schema: path.join('prisma', 'schema.prisma'),
  migrations: {
    path: './prisma/migrations',
    seed: 'tsx ./prisma/seed.ts',
  },
});

Install driver adapter

You need to install a driver adapter depending on your database.

For the example, use install the driver adatper for SQLite.

npm install @prisma/adapter-better-sqlite3

Prisma Client instance

Now create a PrismaClient instance from your custom output and configure the driver adapter.

// src/prisma.extension.ts
import { PrismaBetterSQLite3 } from '@prisma/adapter-better-sqlite3';
import { PrismaClient } from './generated/prisma/client';

const adapter = new PrismaBetterSQLite3({ url: 'file:./prisma/dev.db' });
export const prisma = new PrismaClient({ adapter });

export type PrismaClientType = typeof prisma;

You can also use process.env.DATABASE_URL for setting the url in the adapter.

Seed database

Add seed.ts in your prisma directory and reuse the prisma client instance for seeding your development environment.

// prisma/seed.ts
// reuse the prisma client instance
import { prisma } from '../src/prisma.extension';

async function main() {
  console.log('Seeding database...');
  console.time('Seeding complete 🌱');

  // TODO seed development data

  console.timeEnd('Seeding complete 🌱');
}

main().catch((e) => console.log(e));

Use Rust-free Prisma Client

Register your prisma instance with the CustomPrismaModule.

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CustomPrismaModule } from 'nestjs-prisma/dist/custom';
import { prisma } from './prisma.extension';

@Module({
  imports: [
    CustomPrismaModule.forRootAsync({
      name: 'PrismaService',
      useFactory: () => {
        return prisma;
      },
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

Query your database by injecting CustomPrismaService with your PrismaClientType. You have full access to the Prisma Client with this.prismaService.client.

import { Inject, Injectable } from '@nestjs/common';
import { CustomPrismaService } from 'nestjs-prisma/dist/custom';
import { PrismaClientType } from './prisma.extension';

@Injectable()
export class AppService {
  constructor(
    // ✅ use `ExtendedPrismaClient` from extension for correct type-safety
    @Inject('PrismaService')
    private prismaService: CustomPrismaService<PrismaClientType>,
  ) {}

  users() {
    return this.prismaService.client.user.findMany();
  }
}

Example

Checkout the Rust-free and driver adapter example on GitHub.