Docker로 PostgreSQL 띄우기
version: '3.8'
services:
db:
image: postgres:15
container_name: test-db
restart: always
ports:
- "5432:5432"
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: testtest
POSTGRES_DB: testdb
volumes:
- test_db_data:/var/lib/postgresql/data
volumes:
test_db_data:
prisma/schema.prisma 파일에서 데이터베이스 모델을 정의합니다: graphql 문법임
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[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
prisma generate
lib/prisma.ts 파일을 생성하여 Prisma Client를 설정합니다:
import { PrismaClient } from '@prisma/client'
const globalForPrisma = global as unknown as { prisma: PrismaClient }
export const prisma = globalForPrisma.prisma || new PrismaClient()
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
const createUser = async () => {
const user = await prisma.user.create({
data: {
email: 'user@example.com',
name: 'John Doe',
},
})
return user
}
const getUsers = async () => {
const users = await prisma.user.findMany({
include: {
posts: true,
},
})
return users
}
const getUser = async (id: number) => {
const user = await prisma.user.findUnique({
where: {
id: id,
},
include: {
posts: true,
},
})
return user
}
const updateUser = async (id: number, name: string) => {
const user = await prisma.user.update({
where: {
id: id,
},
data: {
name: name,
},
})
return user
}
const deleteUser = async (id: number) => {
const user = await prisma.user.delete({
where: {
id: id,
},
})
return user
}
await prisma.user.findMany({
cursor: { id: 10 },
take: 10,
})
=> id 10 다음부터 10개 가져옴
const getUsersWithPublishedPosts = async () => {
// 1. [O, O]
// 2. [O, X]
// 3. [X, X]
// 하나라도 배포가 되어있는 포스트를 가지고 있는 유저들
// 배포 되어있는 포스트들만 필터링 해서 가지고 오고싶다
// [1번 유저 + 2개 포스트, 2번 유저 + 1개 포스트]
const users = await prisma.user.findMany({
where: {
posts: {
some: {
published: true,
},
},
},
include: {
posts: {
where: {
published: true,
},
},
},
})
return users
}
const getPostStats = async () => {
const stats = await prisma.post.groupBy({
by: ['authorId'],
_count: {
_all: true,
},
_avg: {
id: true,
},
})
return stats
}