apps/docs/content/docs/guides/frameworks/nuxt.mdx
This guide shows you how to set up Prisma ORM in a Nuxt application with Prisma Postgres.
Create a new Nuxt project:
npx nuxi@latest init hello-prisma
Navigate to the project and install dependencies:
cd hello-prisma
npm install @prisma/client @prisma/adapter-pg pg
npm install -D prisma @types/pg dotenv tsx
Initialize Prisma in your project:
npx prisma init
Update your prisma/schema.prisma:
generator client {
provider = "prisma-client"
output = "./generated"
}
datasource db {
provider = "postgresql"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
Create a prisma.config.ts file in the root of your project:
import { defineConfig, env } from "prisma/config";
import "dotenv/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
seed: "tsx ./prisma/seed.ts",
},
datasource: {
url: env("DATABASE_URL"),
},
});
Update your .env file with your database connection string:
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
Run the migration to create your database tables:
npx prisma migrate dev --name init
Create server/utils/db.ts. Nuxt auto-imports exports from server/utils, making prisma available in all API routes:
import { PrismaPg } from "@prisma/adapter-pg";
import { PrismaClient } from "../../prisma/generated/client";
const prismaClientSingleton = () => {
const pool = new PrismaPg({ connectionString: process.env.DATABASE_URL! });
return new PrismaClient({ adapter: pool });
};
type PrismaClientSingleton = ReturnType<typeof prismaClientSingleton>;
const globalForPrisma = globalThis as unknown as {
prisma: PrismaClientSingleton | undefined;
};
export const prisma = globalForPrisma.prisma ?? prismaClientSingleton();
if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
Create an API route to fetch users. The prisma instance is auto-imported:
export default defineEventHandler(async () => {
const users = await prisma.user.findMany({
include: { posts: true },
});
return users;
});
Create an API route to create a user:
export default defineEventHandler(async (event) => {
const body = await readBody<{ name: string; email: string }>(event);
const user = await prisma.user.create({
data: {
name: body.name,
email: body.email,
},
});
return user;
});
Update app.vue to display users:
<template>
<div>
<h1>Users</h1>
<ul v-if="users?.length">
<li v-for="user in users" :key="user.id">{{ user.name }} ({{ user.email }})</li>
</ul>
<p v-else>No users yet.</p>
</div>
</template>
<script setup>
const { data: users } = await useFetch('/api/users')
</script>
Start the development server:
npm run dev
Open http://localhost:3000 to see your app.
Create a seed file to populate your database with sample data:
import "dotenv/config";
import { PrismaClient } from "./generated/client";
import { PrismaPg } from "@prisma/adapter-pg";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL! });
const prisma = new PrismaClient({ adapter });
async function main() {
const alice = await prisma.user.create({
data: {
name: "Alice",
email: "[email protected]",
posts: {
create: { title: "Hello World", published: true },
},
},
});
console.log(`Created user: ${alice.name}`);
}
main()
.then(() => prisma.$disconnect())
.catch(async (e) => {
console.error(e);
await prisma.$disconnect();
process.exit(1);
});
Run the seed:
npx prisma db seed
You can deploy your Nuxt application to Vercel using one of two methods:
Install the Vercel CLI (if not already installed):
npm install -g vercel
Deploy your project:
npx vercel
Set the DATABASE_URL environment variable:
DATABASE_URL with your database connection stringRedeploy your application to apply the environment variable:
npx vercel --prod
Push your code to a Git repository (GitHub, GitLab, or Bitbucket).
Add prisma generate to your postinstall script in package.json to ensure Prisma Client is generated during deployment:
{
"scripts": {
"postinstall": "prisma generate",
"build": "nuxt build",
"dev": "nuxt dev"
}
}
Import your project in Vercel:
Configure environment variables:
DATABASE_URL with your database connection stringVercel will automatically build and deploy your Nuxt application. The deployment process is the same as any other Node.js application, and Prisma Client will be generated during the build process thanks to the postinstall script.