Prisma๋ Node.js ๋ฐ Typescript์ฉ ORM ๋ ์ด์ด์ ๋๋ค. Prisma๋ ์ฃผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ๋์ง๋ง MongoDb์ ๊ฐ์ no-SQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ถ๊ฐ ๊ตฌ์ฑ์ ํตํด ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ถ์ธ ์ฑ๋ช ํ๊ตญ์ด ์ค๋ ฅ์ด ๋ถ์ ํ์ฌ ์ด ๊ธ์ด ๊ตฌ๊ธ ๋ฒ์ญ๊ธฐ๋ฅผ ์ฃผ๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ถ์ ํํ ๋ฌธ๋ฒ๊ณผ ์ดํ๊ฐ ์์์ ์์ต๋๋ค. ์ด ์ ์ํด ๋ถํ๋๋ฆฌ๋ฉฐ, ์ถํ์ ๋ค์ ๊ฒํ ํ์ฌ ์์ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
Prisma์๋ ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง ๊ตฌ์ฑ ์์๊ฐ ์์ต๋๋ค.
- Prisma Client: Node.js ๋ฐ TypeScript์ฉ์ผ๋ก ์์ฑ๋ ์ ํ ์์ ์ฟผ๋ฆฌ ๋น๋์ ๋๋ค.
- Prisma Migrate: ์ง์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง์ด๊ทธ๋ ์ด์ ์์คํ ์ ๋๋ค.
- Prisma Studio: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ํธ์งํ๋ GUI ๋๊ตฌ์ ๋๋ค.
ํ ์คํธ ์๋ํฐ
์ฐ์ , ๋๋ถ๋ถ์ ์ฝ๋ฉ ์์ ์ ์ ๊ทน ๊ถ์ฅ๋๋ ํ ์คํธ ํธ์ง๊ธฐ๋ ๋ฌผ๋ก Visual Studio Code์ ๋๋ค. ์ฌ๊ธฐ์๋ ๊ตฌ๋ฌธ ๊ฐ์กฐ, ์๋ ์์ ์ง์ ๋ฑ์ ์ ๊ณตํ๊ธฐ ์ํด ์ค์นํ ์ ์๋ Prisma ํ์ฅ์ด ์์ต๋๋ค. ๋ํ ๊ฐ๋ฐ์ ๋น ๋ฅด๊ณ ์ฆ๊ฒ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ ์ฉํ ์ฝ๋ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์ ํ์ ์ค์ด์ค๋๋ค.
ํ๋ก์ ํธ ์ด๊ธฐํ
์์ํ๋ ค๋ฉด ๋น Node.js ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
npm init -y๋ค์์ผ๋ก Prisma, TypeScript ๋ฐ ๊ธฐํ ๋ณด์ ์ข ์์ฑ์ ์ค์นํฉ๋๋ค.
npm install -D prisma typescript ts-node @types/node nodemon์ข ์์ฑ์ด ์ค์น๋๋ฉด ์ด์ ์๋ ๋ช ๋ น์ ์คํํ์ฌ ํ๋ก์ ํธ ๋ด์์ Prisma ์ด๊ธฐํ๋ฅผ ์งํํ ์ ์์ต๋๋ค.
npx prisma init๋ค์๊ณผ ๊ฐ์ด ์คํ ์ถ๋ ฅ๊ณผ ํจ๊ป prisma ํด๋ ๋ด์ ์ถ๊ฐ๋ schema.prisma๋ผ๋ ํ์ผ์ด ์์ต๋๋ค.
โ Your Prisma schema was created at prisma/schema.prisma
You can now open it in your favorite editor.
Next steps:
1. Set the DATABASE_URL in the .env file to point to your existing database. If your database has no tables yet, read https://pris.ly/d/getting-started
2. Set the provider of the datasource block in schema.prisma to match your database: postgresql, mysql, sqlite, sqlserver, mongodb or cockroachdb.
3. Run prisma db pull to turn your database schema into a Prisma schema.
4. Run prisma generate to generate the Prisma Client. You can then start querying your database.
More information in our documentation:
https://pris.ly/d/getting-started์ด์ ๋ Prisma๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ด๊ธฐํ๋์์ผ๋ฉฐ ์งํํ ์ค๋น๊ฐ ๋์์ต๋๋ค.
Prisma ์คํค๋ง
prisma ํด๋ ์์์ schema.prisma ํ์ผ์ ๋ด๋ถ์ ๋ชจ์ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
ย provider = "prisma-client-js"
}
datasource db {
ย provider = "postgresql"
ย url ย ย ย = env("DATABASE_URL")
}์ด ์คํค๋ง ํ์ผ ๋ด์์ ์ธ๊ฐ์ง ํญ๋ชฉ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์์ค: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ง์ ํฉ๋๋ค(ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด).
- ์์ฑ๊ธฐ: ์์ฑํ๋ ค๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ ํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ชจ๋ธ: ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๋ชจ๋ธ ๋ฐ ๊ด๊ณ
์์ฑ๊ธฐ
generator client ๋ด๋ถ์ ์ฝํ
์ธ ๋ ์ฌ์ฉ์ ์ง์ ์คํค๋ง๋ฅผ ์ฝ๊ณ ์ด๋ฅผ Visual Studio Code์ intellisense์์ ํํธ๋ฅผ ์ค ์ ์๋ ์์ ํ ํ์์ ๋ณ์๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ ํฉ๋๋ค. ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
๋ด์์ ์ฌ์ฉ๋ ํด๋ผ์ด์ธํธ์ด๊ธฐ๋ ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ณต๊ธ์๋ prisma-client-js์ด๋ฉฐ ์ด ๊ธ์ ์ฐ๋ ์์ ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ค๋ฅธ ์ ํ์ ํด๋ผ์ด์ธํธ๊ฐ ์์ต๋๋ค. ์์ฑ๊ธฐ์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
๋ฐ์ดํฐ ์์ค
datasource db๋ Prisma์ ํจ๊ป ์ฌ์ฉํ๋ ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ์ ์ง์ ํฉ๋๋ค. ์ด๊ธฐํ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ณต๋์ง ์์ผ๋ฉด PostgreSQL์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. env ํจ์๋ .env ํ์ผ์์ DATABASE_URL์ด๋ผ๋ ๋น๋ฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. DATABASE_URL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ ๋ฌธ์์ด์
๋๋ค.
PostgreSQL ์ฐ๊ฒฐ ๋ฌธ์์ด์ ์ผ๋ฐ์ ์ธ ํ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
postgresql://USER:PASSWORD@HOST:PORT/DATABASE?schema=SCHEMA๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ ๋ฌธ์์ด์ ๋ํ
.envํ์ผ์DATABASE_URL๊ฐ์ ๋ฐ๊พธ์ญ์์ค.
๋ชจํ
๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ค๋ ์ํฐํฐ๋ฅผ ์ค๋ช
ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์
๋๋ค. Prisma์์๋ model ํค์๋๋ก ์ ์ํ ์ ์์ต๋๋ค.
model User {
id Int @id @default(autoincrement())
name String
}Prisma๋ ๋ชจ๋ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ ํญ๋ชฉ์ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ ๊ธฐ๋ณธ ํค ์ญํ ์ ํ๋ ์ผ์ข ์ ์๋ณ์๋ฅผ ๊ฐ๋๋ก ์๊ตฌํฉ๋๋ค.
๋ณด์๋ค์ํผ Prisma ๋ชจ๋ธ ๋ด์ ํ๋๋ ์ด๋ฆ, ๋ฐ์ดํฐ ์ ํ ๋ฐ ์์ฑ์ ์์๋ฅผ ๋ฐ๋ฆ ๋๋ค.
model User {
<name> <datatype> @<attributes>
}@id ์์ฑ์ Prisma์๊ฒ ํด๋น ํ๋๊ฐ ๊ธฐ๋ณธ ํค์ด๊ณ @default()๊ฐ ๊ฐ์ฒด ์์ฑ ์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํจ์ ์๋ ค์ค๋๋ค. autoincrement() ํจ์๋ ๊ฐ ํ์ ํญ๋ชฉ์์ id ๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํต๋๋ค. uuid()๋ ์ธ๋ฑ์ค ํ๋๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ์๋ ์ผ๋ฐ์ ์
๋๋ค. ์์ฑ์ ๋ํด์๋ ๋์ค์ ๋ ์์ธํ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ ํ์
Prisma์๋ ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ด ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฐ์ดํฐ ์ ํ์ ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๊ณต๋๋ ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ ์ผ๋ฐํํ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๊ธฐ์ String์ PostgreSQL์์๋ text ๋ฐ์ดํฐ ์ ํ์ ๋งคํ๋์ง๋ง SQL Server์์๋ nvarchar(1000)์ ๋งคํ๋ฉ๋๋ค. ์ค์นผ๋ผ ์ ํ์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
Int: ์ ์ํString: ๋ชจ๋ ์ข ๋ฅ์ ํ ์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ ํ๋ถ์ธ: ์ฐธ ๋๋ ๊ฑฐ์งBigInt: ๋งค์ฐ ํฐ ์ ์Float: ๋จ์ ๋ถ๋ ์์์ Decimal: ์ ํํ ๋ถ๋ ์์์ DateTime: ํ์์คํฌํJson: JSON ํ์, ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ง์๋์ง๋ ์์๋ฐ์ดํธ: ํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์์ ๋ฐ์ดํธ ํ์์ ๋ฐ์ดํฐUnsupported(""): ์ง์ํ์ง ์๋ ํ์ , ๋ค๋ฅธ db์์ prisma๋ก ๋ณํํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๋จ
ํ์ ์์ ์
์ ํ ์์ ์๋ ํ๋์ ๋์์ ์์ ํ๋ ๊ฒ์ ๋๋ค. Prisma์๋ ๋จ 2๊ฐ์ ์์ ์๊ฐ ์์ผ๋ฉฐ ์ดํดํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค.
- nullable ์์ ์
?: ํ๋๋ฅผ nullable๋ก ํ์ํฉ๋๋ค. - ๋ฐฐ์ด ์์ ์
[]: ํ๋๊ฐ ์ฌ๋ฌ ๋ฐ์์ ์ฐธ์กฐํ ์ ์์์ ๋ํ๋ ๋๋ค.
๊ด๊ณ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํฐํฐ๊ฐ ๊ฐ์ง ์ ์๋ ๊ด๊ณ์๋ ์ผ๋์ผ, ์ผ๋๋ค, ๋ค๋์ผ, ๋ค๋๋ค์ 4๊ฐ์ง ์ ํ์ด ์์ต๋๋ค.
- ์ผ๋๋ค:
User๊ฐ ์ฌ๋ฌPost๋ฅผ ๊ฐ์ง๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํค๋ง๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
model User {
id Int
name String
posts Post[]
}
model Post {
id Int
title String
author User @relation(fields: [authorId], references: [id])
authorId Int
}- ์ด์ค ์ผ๋๋ค:
์ฌ์ฉ์๋๊ฒ์๋ฌผ์ ๋ํ ๋ค์ค ์ฐธ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋writePosts์favouritePosts๊ฐ ์์ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ผ๋๋ค ๊ด๊ณ ๋ช ํํ
model User {
id Int
name String
writtenPosts Post[] @relation("WrittenPosts")
favouritePosts Post[] @relation("FavoritePosts")
}
model Post {
id Int
title String
author User @relation("WrittenPosts", fields: [authorId], references: [id])
authorId Int
favoritedBy User? @relation("FavoritePosts", fields: [favoritedById], references: [id])
favoritedById Int?
}- ๋ค๋๋ค: ํ๋์ '๊ฒ์๋ฌผ'์ ์ฌ๋ฌ ๊ฐ์ '์นดํ ๊ณ ๋ฆฌ'๋ฅผ ๊ฐ์ง ์ ์๊ณ ํ๋์ '์นดํ ๊ณ ๋ฆฌ'๋ ์ฌ๋ฌ ๊ฐ์ '๊ฒ์๋ฌผ'์ ๊ฐ์ง ์ ์์ต๋๋ค.
model Post {
id Int
title String
categories Category[]
}
model Category {
id Int
name String
posts Post[]
}- ์ผ๋์ผ: ํ ๋ช
์
์ฌ์ฉ์๊ฐ ํ๋์UserPreference์ธํธ๋ฅผ ๊ฐ์ง๋๋ค.
model User {
id Int
name String
preference UserPreference?
}
model UserPreference {
id Int
emailUpdates Boolean
user User @relation(fields: [userId], references:[id])
userId Int @unique
}์ผ๋์ผ ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ userId ํ๋๋ฅผ @unique๋ก ํ์ํด์ผ ํฉ๋๋ค. ๊ณ ์ ํ์ง ์์ผ๋ฉด ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
์์ฑ
์์ฑ์ ํ๋ ๋๋ ๋ชจ๋ธ ๋ธ๋ก์ ๋์์ ์์ ํฉ๋๋ค. ์์ฑ์ ๋ณ์นญ ๊ธฐํธ @ ๋๋ @@์ผ๋ก ์์๋ฉ๋๋ค.
ํ๋ ์์ค ์์ฑ
@id: ํ๋๊ฐ ์๋ณ์์์ ์ง์ ํฉ๋๋ค.@default(): ํด๋น ํ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ง์ ํฉ๋๋ค.@default(autoincrement()): ์ ์ ํ๋๋ฅผ 1์ฉ ์ฆ๋ถ ์ ๋ฐ์ดํธํฉ๋๋ค.@default(uuid()): ๊ณ ์ ํ๊ฒ ์๋ณ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.@default(now()): ์์ฑ ์ ํ์์คํฌํ๋ฅผ ์ถ๊ฐํ๋DateTimeํ๋์ ์์ ์ด๋ฃน๋๋ค.@relation(): ํด๋น ํ๋์ ๋ค๋ฅธ ๋ชจ๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ง์ ํฉ๋๋ค.@unique: ๋์ผํ ๊ฐ์ ๊ฐ์ง ํญ๋ชฉ์ ์๋ํ๋๋ก ํ๋๋ฅผ ๊ณ ์ ํ๊ฒ ์ง์ ํฉ๋๋ค.@updatedAt: ์์ ์ ํ๋๋ฅผ ์ต์ ํ์์คํฌํ๋ก ์๋ ์ ๋ฐ์ดํธํ๋DateTimeํ๋์ ์์ ์ด๋ฃน๋๋ค.
๋ธ๋ก ์์ค ์์ฑ
๋จ์ผ ํ๋ ๋์ ์ ์ฒด ๋ชจ๋ธ์ ์ ์ฉ๋๋ ์์ฑ์ ๋๋ค.
@@unique([]): ๋ณตํฉ ํ๋์ ๊ณ ์ ์ ์ฝ ์กฐ๊ฑด์ ์ ๊ณตํฉ๋๋ค.
model User {
id Int
name String
age Int
@@unique([name, age])
}@@index([]): ์ง์ ๋ ํ๋์ ๋ํ ์ธ๋ฑ์ค ํ๋๋ฅผ ์์ฑํ๊ณ ์ ๋ ฌ ๋ฐ ์ฑ๋ฅ์ ๋์์ด ๋ฉ๋๋ค.
model User {
id Int
name String
age Int
@@unique([name, age])
@@index([email])
}@@id([]): ์ง์ ๋ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณตํฉ ID๋ฅผ ์์ฑํฉ๋๋ค.
model User {
// no more id field
name String
age Int
@@id([name, age])
}@@map([]): ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ค์ ์ด๋ฆ์ ๋ํ ํ์ฌ ๋ชจ๋ธ์ ๋งคํ์ ์์ฑํฉ๋๋ค.
model User {
id Int
name String
age Int
@@map("my_users")
}์ด๊ฑฐํ
์ฐ๋ฆฌ์๊ฒ ์ต์ํ ์ผ๋ฐ์ ์ธ ์ด๊ฑฐํ์ ๋๋ค. ๊ณ ์ ๋ ๊ฐ ์งํฉ ๋๋ ํ๋๊ฐ ์ฌ์ฉํ ์ ์๋ ๋ณํ์ ๋ํ๋ ๋๋ค.
enum Role {
SUPERUSER,
BASIC,
READER
}๊ทธ ํ์๋ ๋ชจ๋ธ ๋ด๋ถ์์ ๋ฐ์ดํฐ ์ ํ์ผ๋ก ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
model User {
id Int
name String
role Role @default(BASIC)
}Prisma ํด๋ผ์ด์ธํธ
Prisma ํด๋ผ์ด์ธํธ๋ VSCode์์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ์คํค๋ง์ ์ ์ํ ์ฌ์ฉ์ ์ ์ ์ ํ์ ์์ฑํ ์ ์๋๋ก ์คํค๋ง ํ์ผ์ด ์์ ๋ ๋๋ง๋ค ๋ค์ ์์ฑ๋์ด์ผ ํฉ๋๋ค.
์คํค๋ง๊ฐ ํ์ ๋๋ฉด ํด๋ผ์ด์ธํธ ์์ฑ์ ์งํํ ์ ์์ต๋๋ค.
npx prisma generate์ด ๋ช ๋ น์
schema.prismaํ์ผ์ ๋ณ๊ฒฝํ ๋๋ง๋ค ์คํ๋์ด์ผ ํฉ๋๋ค.
package.json์ ๋ํ๋์ผ ํฉ๋๋ค.
"dependencies": {
ย ย "@prisma/client": "^4.4.0"
}Create
๋ฃจํธ์ ์ง์ index.ts ํ์ผ์ ๋ง๋ค๊ณ ๋ค์ ๋ด์ฉ์ผ๋ก ์ฑ์๋๋ค.
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
async function main() {
await prisma.user.create({
data: {
// populating data fields
age: 17,
name: 'Elrond',
email: 'elrond@wix.com',
},
})
}
main()
.catch(console.error)
.finally(async () => await prisma.$disconnect())์์ ์ฝ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด๋ถ์ User ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด PrismaClient์ ์ธ์๋ฅผ ์ ๊ณตํ๋ฉด ๋ฉ๋๋ค.
new PrismaClient({
log: ['query', 'error', 'info', 'warn'],
})Nested Create
User ์คํค๋ง ๋ด์ ์ฌ์ฉ์ ์ ์ ๋ชจ๋ธ User Preference๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
model User {
id Int
name String
preference UserPreference
}ํด๋ผ์ด์ธํธ์์ UserPreference ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ User ์ํฐํฐ๋ฅผ ๋ชจ๋ ์ธ์คํด์คํํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
await prisma.user.create({
data: {
// ... other fields of data
preference: {
create: {
// ... data for `UserPreference`
},
},
},
})create ํจ์๋ ์์ฑ ์ค์ธ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ๋ ์ค์ฒฉ ํญ๋ชฉ์ ๋ฐํ๋์ง ์์ต๋๋ค. ์ด๋ฅผ ํฌํจํ๋ ค๋ฉด include ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ํฌํจํ ๊ฐ์ฒด๋ฅผ true๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
await prisma.user.create({
data: {
// ... ๋ค๋ฅธ ๋ฐ์ดํฐ
preference: {
create: {
// ... `UserPreference`์ ๋ํ ๋ฐ์ดํฐ
},
},
},
include: {
preference: true,
},
})๋ฐ์ดํฐ์ ์ผ๋ถ๋ง ๊ฐ์ ธ์ค๋ ค๋ฉด select ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ true๋ก ์ํ๋ ํ๋๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
await prisma.user.create({
data: {
// ... ๋ค๋ฅธ ๋ฐ์ดํฐ
preference: {
create: {
// ... `UserPreference`์ ๋ํ ๋ฐ์ดํฐ
},
},
},
select: {
name: true,
},
})Select๋ ์ค์ฒฉ๋ ๊ฐ์ฒด์์๋ ์ ์๋ํฉ๋๋ค. ์ค์ฒฉ๋ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ณ GraphQL์ฒ๋ผ ๋ฐํํ๋ ค๋ ํ๋๋ง ๋์์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
await prisma.user.create({
data: {
// ... other fields of data
preference: {
create: {
// ... data for `UserPreference`
},
},
},
select: {
name: true,
preference: {
select: {
// field: true
},
},
},
})์ฐธ๊ณ :
select์include๋ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋จ์ง ๋ ์ค ํ๋์ ๋๋ค.
Create Many
ํ ๋ฒ์ ํ๋์ฉ ์ด๊ธฐํํ๋ ๋์ ํ ๋ฒ์ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
await prisma.user.createMany([
// ์ฌ์ฉ์ ๋ฐฐ์ด
])ํ:
createMany๋ด์์๋select๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Find Unique
unique๋ก ํ์๋ ํ๋๋ฅผ ํตํด ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ฐพ์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ ๋ชจ๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ฉด findUnique๋ฅผ ์ฌ์ฉํ์ฌ email ๋๋ ssn ํ๋๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
model User {
id Int
name String
email String @unique
ssn String @unique
}const user = await prisma.user.findUnique({
where: {
email: 'abc@email.com',
},
// select? include? ๋ ์ฌ๊ธฐ์ ํ์ฉ๋ฉ๋๋ค
})์ฌ๋ฌ ํ๋์ ๊ฑธ์ณ ๋ธ๋ก ์์ค ๊ณ ์ ์ ์ฝ ์กฐ๊ฑด์ด ์ง์ ๋๋ฉด Prisma๋ ํ๋ ์ด๋ฆ์ ๋ณ์๋ก ๊ตฌ๋ถํ๋ ๋ฐ์ค๋ก ์ฐธ์กฐ๋ฅผ ์ ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด์
model User {
id Int
name String
age Int
@@unique([name, age])
}์ฟผ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ ๋ณ์๋ก name_age๋ฅผ ์์ฑํฉ๋๋ค.
await prisma.user.findUnique({
where: {
name_age: {
name: 'Ken',
age: 27,
},
},
})Find First
findUnique์ ๋ฌธ์ ๋ name์ด๋ age๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฟผ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ํ๋ ์ค ํ๋๋ง ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ํ๋ ค๋ ๊ฒฝ์ฐ ๋์ findFirst๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
await prisma.user.findFirst({
where: {
name: 'Hailey',
},
})Find Many
์ด๋ฆ์ด ์ ์ํ ๋๋ก ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฐพ๊ณ , ๊ฒ์ ๊ธฐ์ค์ด ๋ฐฐ์ด๋ก ์ถฉ์กฑ๋๋ฉด ์ฌ๋ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
await prisma.user.findMany({
where: {
age: 12,
},
})distinct ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ณต๋ ํ๋์์ ๊ณ ์ ํ๊ฒ ํํฐ๋งํ ํ ์ฒซ ๋ฒ์งธ ๋ ์ฝ๋๊ฐ ๋ฐํ๋ฉ๋๋ค.
await prisma.user.findMany({
where: {
name: 'Jack',
},
distinct: ['name', 'age'],
})ํ์ด์ง ๋งค๊น์ ์ํด ๊ฒ์ ์ฟผ๋ฆฌ ๋ด์์ 'take' ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. skip ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณตํ๋ฉด take๋ฅผ ์คํํ๊ธฐ ์ ์ ๋จผ์ ์ง์ ๋ ๋ ์ฝ๋ ์๋ฅผ ๊ฑด๋๋๋๋ค.
await prisma.user.findMany({
where: {
name: 'Jack',
},
take: 2,
skip: 1,
})์ ๋ ฌํ๋ ค๋ ํ๋๋ณ๋ก ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ ์๋ ์์ต๋๋ค.
await prisma.user.findMany({
where: {
name: 'Jack',
},
orderBy: {
age: 'asc',
},
})๊ณ ๊ธ ํํฐ๋ง
where ์ ์ ์ฌ์ฉํ๋ฉด ๋ง์ ์ผ์ ํ ์ ์์ต๋๋ค.
{
"name": { "equals": "" },
"name": { "not": "" },
"name": { "in": ["Nick", "Josh"] },
"name": { "notIn": ["Nick", "Josh"] },
"age": { "lt": 20 },
"age": { "gt": 20 },
"age": { "gte": 20 },
"age": { "lte": 20 },
"email": { "contains": "@test.com" },
"email": { "endsWith": "@gmail.com" },
"email": { "startsWith": "hi" }
}์ฌ๋ฌ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐ๊ฒฐํ๋ ค๋ฉด 'AND', 'OR' ๋ฐ 'NOT'์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ํจ๊ป ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
await prisma.user.findMany({
where: {
AND: [{ name: { equals: 'Sam' } }, { age: { gte: 20 } }],
},
})๊ด๊ณ ํํฐ๋ง
ํ์ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ ์๋ ์์ต๋๋ค. every๋ none๊ณผ some์ผ๋ก ๋์ฒด๋ ์ ์์ต๋๋ค.
await prisma.user.findMany({
where: {
// nested objects
writtenPosts: {
every: {
title: 'test',
},
},
},
})๋ค์์ ํตํด ์์ฑ์๊ฐ 20์ธ์ธ ๋ชจ๋ ๊ฒ์๋ฌผ์ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.
await prisma.post.findMany({
where: {
author: {
id: {
age: 20,
},
},
},
})์ ๋ฐ์ดํธ
๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๊ณ ์ด๋ฅผ ์
๋ฐ์ดํธ๋ ๋ฒ์ ์ผ๋ก ๋ฐ๊ฟ๋๋ค. ๋ฐ๊ฒฌ๋ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ ๋ค๋ฅธ ๋ฒ์ ์ updateMany()์
๋๋ค.
await prisma.user.update({
where: {
email: 'Test@test.com',
},
data: {
email: 'Deck@test.com',
},
})Prisma์๋ ์ ์ ๊ฐ ์
๋ฐ์ดํธ์ ๊ด๋ จํ์ฌ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๊ธฐ๋ฅ์ด ์์ต๋๋ค. increment, decrement, multiply, divide์ ๊ฐ์ ์ํ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
await prisma.user.update({
where: {
email: 'Test@test.com',
},
data: {
age: {
increment: 1,
},
},
})ํ:
update*๋ ๊ณ ์ ํ๋์ ๋ํด ์ฟผ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
Connect ๋ฉ์๋
Connect ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์์ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
await prisma.user.update({
where: {
id: 123,
},
data: {
userPreference: {
connect: {
// assuming already have a userPreference obj with the id
id: 'abc123',
},
},
},
})disconnect๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฐ์ฒด์ ๋ํ ๊ธฐ์กด ์ฐธ์กฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
await prisma.user.update({
where: {
id: 123,
},
data: {
userPreference: {
disconnect: true,
},
},
})์ญ์
delete ๋ฐ deleteMany๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
await prisma.user.delete({
where: {
id: 123,
},
})์ํ:
deleteManyํจ์์ ์๋ฌด๊ฒ๋ ์ ๋ฌํ์ง ์์ผ๋ฉด ์ ์ฒด ํ ์ด๋ธ์ด ์ ๊ฑฐ๋ฉ๋๋ค.