How to use Prisma ORM in a Turborepo monorepo

I'm trying to setup Prisma ORM in a Turborepo monorepo. What's the best practice to do that?
1 Reply
Prisma AI Help
Prisma AI Help4mo ago
You chose to compile with the bot. One moment while I piece together your answer… To use Prisma ORM in a Turborepo monorepo, the best practice is to set up Prisma as a standalone package (e.g., @repo/db) inside your packages directory. This allows you to centralize your schema, generated client, and types, making them reusable across all your apps. Here’s a concise step-by-step guide: 1. Create the database package
In your monorepo root:
mkdir -p packages/database
cd packages/database
pnpm init
pnpm add prisma --save-dev
pnpm add @prisma/client

mkdir -p packages/database
cd packages/database
pnpm init
pnpm add prisma --save-dev
pnpm add @prisma/client

If using Prisma Postgres, also add:
pnpm add @prisma/extension-accelerate

pnpm add @prisma/extension-accelerate

2. Initialize Prisma and set up schema
pnpm prisma init --db --output ../generated/prisma

pnpm prisma init --db --output ../generated/prisma

Edit prisma/schema.prisma to define your models and set the generator output to ../generated/prisma. 3. Add scripts for migration and generation
In packages/database/package.json:
"scripts": {
"db:generate": "prisma generate",
"db:migrate": "prisma migrate dev --skip-generate",
"db:deploy": "prisma migrate deploy"
}

"scripts": {
"db:generate": "prisma generate",
"db:migrate": "prisma migrate dev --skip-generate",
"db:deploy": "prisma migrate deploy"
}

4. Export the Prisma client and types
In packages/database/src/client.ts:
import { PrismaClient } from "../generated/prisma";
import { withAccelerate } from "@prisma/extension-accelerate";
const globalForPrisma = global as unknown as { prisma: PrismaClient };
export const prisma = globalForPrisma.prisma || new PrismaClient().$extends(withAccelerate());
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;

import { PrismaClient } from "../generated/prisma";
import { withAccelerate } from "@prisma/extension-accelerate";
const globalForPrisma = global as unknown as { prisma: PrismaClient };
export const prisma = globalForPrisma.prisma || new PrismaClient().$extends(withAccelerate());
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;

In packages/database/src/index.ts:
export { prisma } from './client';
export * from "../generated/prisma";

export { prisma } from './client';
export * from "../generated/prisma";

5. Import and use in your apps
Add @repo/db as a dependency in your app’s package.json, then import and use the shared prisma instance. 6. Environment variables
Copy your .env (with DATABASE_URL) to each app, or use a tool like dotenvx for shared env m anagement. 7. Configure Turborepo tasks
Ensure db:generate runs before dev or build in your turbo.json to avoid missing client errors. This setup ensures type safety, avoids duplication, and works seamlessly with Turborepo’s caching and task orchestration features. For more details, see the official Prisma Turborepo guide and example code in the docs. ✅ Great, thanks for letting us know that this solved your question!

Did you find this page helpful?