apps/docs/content/docs.v6/orm/overview/introduction/what-is-prisma.mdx
Prisma ORM is an open-source next-generation ORM. It consists of the following parts:
Prisma Client: Auto-generated and type-safe query builder for Node.js & TypeScript
Prisma Migrate: Migration system
Prisma Studio: GUI to view and edit data in your database.
:::info
Prisma Studio is the only part of Prisma ORM that is not open source. You can only run Prisma Studio locally.
:::
Prisma Client can be used in any Node.js (supported versions) or TypeScript backend application (including serverless applications and microservices). This can be a REST API, a GraphQL API, a gRPC API, or anything else that needs a database.
<div style={{ textAlign: "center", margin: "2em auto" }} class="videoWrapper"> <iframe width="560" height="315" src="https://www.youtube.com/embed/EEDGwLB55bI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen ></iframe> </div>Every project that uses a tool from the Prisma ORM toolkit starts with a Prisma schema. The Prisma schema allows developers to define their application models in an intuitive data modeling language. It also contains the connection to a database and defines a generator:
datasource db {
provider = "postgresql"
}
generator client {
provider = "prisma-client"
output = "./generated"
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId Int?
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
}
datasource db {
provider = "mongodb"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model Post {
id String @id @default(auto()) @map("_id") @db.ObjectId
title String
content String?
published Boolean @default(false)
author User? @relation(fields: [authorId], references: [id])
authorId String @db.ObjectId
}
model User {
id String @id @default(auto()) @map("_id") @db.ObjectId
email String @unique
name String?
posts Post[]
}
Note: The Prisma schema has powerful data modeling features. For example, it allows you to define "Prisma-level" relation fields which will make it easier to work with relations in the Prisma Client API. In the case above, the
postsfield onUseris defined only on "Prisma-level", meaning it does not manifest as a foreign key in the underlying database.
In this schema, you configure three things:
prisma.config.ts.Database connection URLs are configured in a prisma.config.ts file. Create a prisma.config.ts file in your project root:
import "dotenv/config";
import { defineConfig, env } from "prisma/config";
export default defineConfig({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
seed: "tsx ./prisma/seed.ts",
},
datasource: {
url: env("DATABASE_URL"),
},
});
:::info
When using Prisma CLI commands, environment variables are not automatically loaded. You'll need to use a package like dotenv to load environment variables from a .env file, or ensure your environment variables are set in your shell.
:::
On this page, the focus is on the data model. You can learn more about Data sources and Generators on the respective docs pages.
The data model is a collection of models. A model has two major functions:
There are two major workflows for "getting" a data model into your Prisma schema:
Once the data model is defined, you can generate Prisma Client which will expose CRUD and more queries for the defined models. If you're using TypeScript, you'll get full type-safety for all queries (even when only retrieving the subsets of a model's fields).
The first step when using Prisma Client is installing the @prisma/client and prisma npm packages:
npm install prisma --save-dev
npm install @prisma/client
Then, you can run prisma generate:
npx prisma generate
The prisma generate command reads your Prisma schema and generates Prisma Client code. The code is generated into the path specified in the output field of your generator block (e.g., ./generated as shown in the schema example above).
After you change your data model, you'll need to manually re-generate Prisma Client by running prisma generate to ensure the generated code gets updated.
Once Prisma Client has been generated, you can import it in your code and send queries to your database. This is what the setup code looks like.
import { PrismaClient } from "./generated/client";
const prisma = new PrismaClient();
const { PrismaClient } = require("./generated/client");
const prisma = new PrismaClient();
Now you can start sending queries via the generated Prisma Client API, here are a few sample queries. Note that all Prisma Client queries return plain old JavaScript objects.
Learn more about the available operations in the Prisma Client API reference.
User records from the database// Run inside `async` function
const allUsers = await prisma.user.findMany();
posts relation on each returned User object// Run inside `async` function
const allUsers = await prisma.user.findMany({
include: { posts: true },
});
Post records that contain "prisma"// Run inside `async` function
const filteredPosts = await prisma.post.findMany({
where: {
OR: [{ title: { contains: "prisma" } }, { content: { contains: "prisma" } }],
},
});
User and a new Post record in the same query// Run inside `async` function
const user = await prisma.user.create({
data: {
name: "Alice",
email: "[email protected]",
posts: {
create: { title: "Join us for Prisma Day 2020" },
},
},
});
Post record// Run inside `async` function
const post = await prisma.post.update({
where: { id: 42 },
data: { published: true },
});
Note that when using TypeScript, the result of this query will be statically typed so that you can't accidentally access a property that doesn't exist (and any typos are caught at compile-time). Learn more about leveraging Prisma Client's generated types on the Advanced usage of generated types page in the docs.
As mentioned above, there are two ways for "getting" your data model into the Prisma schema. Depending on which approach you choose, your main Prisma ORM workflow might look different.
With Prisma Migrate, Prisma ORM's integrated database migration tool, the workflow looks as follows:
prisma migrate dev CLI commandTo learn more about the Prisma Migrate workflow, see:
If for some reason, you can not or do not want to use Prisma Migrate, you can still use introspection to update your Prisma schema from your database schema. The typical workflow when using SQL migrations and introspection is slightly different:
To learn more about the introspection workflow, please refer the introspection section.