Prisma

Next-gen TypeScript ORM - type-safe queries, auto-generated client, visual DB browser, migrations

TL;DR

What: A next-generation ORM for Node.js and TypeScript.

Why: Type-safe queries, auto-generated client, visual database browser, migrations.

Quick Start

Install:

npm install prisma --save-dev
npm install @prisma/client
npx prisma init

Define schema (prisma/schema.prisma):

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id    Int     @id @default(autoincrement())
  email String  @unique
  name  String?
  posts Post[]
}

model Post {
  id       Int    @id @default(autoincrement())
  title    String
  author   User   @relation(fields: [authorId], references: [id])
  authorId Int
}

Run migrations:

npx prisma migrate dev --name init

Cheatsheet

CommandDescription
npx prisma initInitialize Prisma
npx prisma migrate devCreate migration
npx prisma generateGenerate client
npx prisma studioOpen database browser
npx prisma db pushPush schema (no migration)
npx prisma db pullPull schema from DB

Gotchas

CRUD operations

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()

// Create
const user = await prisma.user.create({
  data: { email: '[email protected]', name: 'John' }
})

// Read
const users = await prisma.user.findMany()
const user = await prisma.user.findUnique({ where: { id: 1 } })

// Update
await prisma.user.update({
  where: { id: 1 },
  data: { name: 'Johnny' }
})

// Delete
await prisma.user.delete({ where: { id: 1 } })

Relations

// Create with relation
await prisma.post.create({
  data: {
    title: 'Hello',
    author: { connect: { id: 1 } }
  }
})

// Query with relations
const userWithPosts = await prisma.user.findUnique({
  where: { id: 1 },
  include: { posts: true }
})

Filtering

const users = await prisma.user.findMany({
  where: {
    email: { contains: '@example.com' },
    name: { not: null },
    posts: { some: { title: { startsWith: 'Hello' } } }
  },
  orderBy: { name: 'asc' },
  take: 10,
  skip: 0
})

Next Steps