https://www.prisma.io/docs/concepts/overview/what-is-prisma
Prisma 는 오픈소스 next-generation ORM 입니다.
ORM (Object Relational Mapping) 이란?
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다.
일종의 번역기라 보면 되는데, 자바스크립트(타입스크립트) 코드와 DB 사이를 연결해주는 것이다.
Prisma Studio
의 경우 Prisma ORM의 일부이지만 오픈소스는 아닙니다.Data Browser
라는 이름으로 Prisma Data Platform
으로 상업적으로 제공됩니다.Node.js
또는 Typescript
백엔드 어플리케이션에 사용할 수 있습니다.(서버리스 애플리케이션 및 마이크로서비스 포함)REST API
, GraphQL API
, gRPC API
등으로 쓸 수 있습니다.schema.prisma 는 데이터베이스에 대한 모든 설명을 담은 파일입니다.
Prisma schema file
과 Prisma toolkit
으로 시작합니다.Prisma Schema
는 개발자에게 직관적인 데이터 모델링 언어로 application models
를 정의할 수 있게 해줍니다.db
와 generator
의 정의를 연결해줍니다.datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
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[]
}
User
모델의 posts
field 는 오직 "Prisma-Level" 에 정의됩니다. 즉, 기본 데이터베이스에서 foreign key
로 나타나지 않습니다.Prisma schema 는 강력한 데이터 모델링 기능을 가지고 있습니다.
예를들어, "Prisma-level" relation fields 를 정의할 수 있게 해줍니다.
MongoDB
의 컬렉션을 나타냅니다Prisma Client API
에서 쿼리에 대한 기반 제공Prisma Schema
로 data model
을 '얻는' 두가 주요 워크플로우가 있습니다.
Prisma Migrate
를 사용하여 데이터 모델을 수동으로 작성하고 데이터베이스에 매핑데이터 모델이 정의되면 정의된 모델에 대한 CRUD 및 더 많은 쿼리를 노출하는 Prisma Client
를 생성할 수 있습니다.
TypeScript
를 사용하는 경우 모델 필드의 하위 집합만 검색하는 경우에도 모든 쿼리에 대해 type-safety를 제공합니다.
Prisma Client
를 사용할 때 우선적으로 해야 하는 것은 @prisma/client
를 설치하는 것입니다.
npm install @prisma/client
@prisma/client
패키지를 설치하면 prisma generate
명령이 실행되고, prisma schema
를 읽고 prisma Client 코드를 생성합니다.
node_modules/.prisma/client
폴더에 생성됩니다.데이터 모델을 변경한 후에는 수동으로 Prisma Client
를 다시 생성하여 node_modules/.prisma/client
내부의 코드를 업데이트해야 합니다:prisma generate
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
JavaScript
객체를 반환합니다. [Prisma Client API reference] 에서 사용 가능한 작업에 대해 자세히 알아보세요.
User
레코드를 데이터베이스에서 검색
// Run inside `async` function
const allUsers = await prisma.user.findMany();
반환되는 각
User
객체에posts
릴레이션을 포함하기
// Run inside `async` function
const allUsers = await prisma.user.findMany({
include: { posts: true },
});
"prisma" 를 포함하는
Post
레코드를 필터링
// Run inside `async` function
const filteredPosts = await prisma.post.findMany({
where: {
OR: [
{ title: { contains: "prisma" } },
{ content: { contains: "prisma" } },
],
},
});
새로운
User
와Post
를 생성하고 같은 쿼리에 기록하기
// Run inside `async` function
const user = await prisma.user.create({
data: {
name: "Alice",
email: "alice@prisma.io",
posts: {
create: { title: "Join us for Prisma Day 2020" },
},
},
});
이미 존재하는
Post
를 업데이트 하기
// Run inside `async` function
const post = await prisma.post.update({
where: { id: 42 },
data: { published: true },
});
TypeScript
를 사용할 때 이 쿼리의 결과는 존재하지 않는 속성에 실수로 액세스할 수 없도록 정적으로 입력됩니다.prisma migrate dev
CLI 명령을 사용하여 개발 데이터베이스 마이그레이션