반응형
prisma/schema.prisma
model User {
id Int @id @default(autoincrement()) // pk, autoincremnt속성
email String @unique // unique속성
name String? @db.VarChar(255)
posts Post[] // 1:N 관계 설정
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false) // default값 설정
author User @relation(fields: [authorId], references: [id]) // fields : fk키, references : 연결 테이블의 키
authorId Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
// .env file
// DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"
프리즈마 모델 생성 및 DB Conneciton 생성
prisma 데이터 생성 (INSERT)
const prisma = new PrismaClient()
/** 단건 INSERT 예제1 **/
async function main() {
const user = await prisma.user.create({
data: {
name: 'Alice',
email: 'alice@prisma.io',
},
})
console.log(user)
}
/** 단건 INSERT 예제2 **/
async function main() {
const user = await prisma.user.create({
data: {
name: 'Bob',
email: 'bob@prisma.io',
posts: {
create: {
title: 'Hello World',
},
},
},
})
console.log(user)
}
/** user, posts 테이블 데이터 INSERT **/
// 따로따로 데이터 INSERT할 수 있지만 연관관계가 있기 때문에 데이터 무결성 해결
const result = await prisma.user.create({
data: {
email: 'saanvi@prisma.io',
posts: {
createMany: {
data: [{ title: 'My first post' }, { title: 'My second post' }],
},
},
},
include: {
posts: true,
},
})
// connect의 경우 이미 있는 데이터의 연관관계를 체크한 후에 있으면 데이터를 생성
const result = await prisma.user.create({
data: {
email: 'vlad@prisma.io',
posts: {
connect: [{ id: 8 }, { id: 9 }, { id: 10 }],
},
},
include: {
posts: true, // Include all posts in the returned object
},
})
prisma 조회 (SELECT)
const prisma = new PrismaClient() // 프리즈마 객체 생성
/** user 테이블 전체 조회 **/
async function main() {
const users = await prisma.user.findMany()
console.log(users)
}
/** unique키 성질 조회**/
const getUser: User | null = await prisma.user.findUnique({
where: {
id: 22,
},
})
/** 첫번째 결과값만 가져오기 **/
const user = await prisma.user.findFirst({
include: {
posts: true,
},
})
/** 집계 조회 (갯수) **/
const relationCount = await prisma.user.findMany({
include: {
_count: {
select: { posts: true },
},
},
})
/** 특정 필드 조회 + where절 **/
const getUser: object | null = await prisma.user.findUnique({
where: {
id: 22,
},
select: {
email: true,
name: true,
},
})
/** 특정 필드 조회 Join **/
const users = await prisma.user.findMany({
select: {
name: true,
posts: {
select: {
title: true,
},
},
},
})
/** user 테이블 Join 조회 **/
async function main() {
const usersWithPosts = await prisma.user.findMany({
include: {
posts: true,
},
})
console.dir(usersWithPosts, { depth: null })
}
/** OR, NOT 절 **/
const result = await prisma.user.findMany({
where: {
OR: [
{
email: {
endsWith: 'prisma.io',
},
},
{ email: { endsWith: 'gmail.com' } },
],
NOT: {
email: {
endsWith: 'hotmail.com',
},
},
},
select: {
email: true,
},
})
/** 포함 여부 **/
const firstQueryResults = await prisma.post.findMany({
take: 4,
where: {
title: {
contains: 'Prisma' /* Optional filter */,
},
},
orderBy: {
id: 'asc',
},
})
/** 정렬 **/
const usersWithPosts = await prisma.user.findMany({
orderBy: [
{
role: 'desc',
},
{
name: 'desc',
},
],
include: {
posts: {
orderBy: {
title: 'desc',
},
select: {
title: true,
},
},
},
})
/** 커서기반 **/
// 처음 조회
const firstQueryResults = await prisma.post.findMany({
take: 4,
where: {
title: {
contains: 'Prisma' /* Optional filter */,
},
},
orderBy: {
id: 'asc',
},
})
const lastPostInResults = firstQueryResults[3] // Remember: zero-based index! :)
const myCursor = lastPostInResults.id // Example: 29
// 다음 조회
const secondQueryResults = await prisma.post.findMany({
take: 4,
skip: 1, // Skip the cursor
cursor: {
id: myCursor,
},
where: {
title: {
contains: 'Prisma' /* Optional filter */,
},
},
orderBy: {
id: 'asc',
},
})
/** OFFSET, LIMIT **/
const results = await prisma.post.findMany({
skip: 3, // offset
take: 4, // limit
})
prisma 조회 (UPDATE)
/** 특정 조건 연관관계 레코드 단건 업데이트 **/
const result = await prisma.user.update({
where: {
id: 6,
},
data: {
posts: {
update: {
where: {
id: 9,
},
data: {
title: 'My updated title',
},
},
},
},
include: {
posts: true,
},
})
/** 특정 조건 연관관계 레코드 다건 업데이트 **/
const result = await prisma.user.update({
where: {
id: 6,
},
data: {
posts: {
updateMany: {
where: {
published: true,
},
data: {
published: false,
},
},
},
},
include: {
posts: true,
},
})
prisma 조회 (DELETE)
/** 관련 데이터 전체 삭제**/
const result = await prisma.user.update({
where: {
id: 11,
},
data: {
posts: {
deleteMany: {},
},
},
include: {
posts: true,
},
})
/** 관련 데이터 조건 삭제**/
const result = await prisma.user.update({
where: {
id: 11,
},
data: {
posts: {
deleteMany: {
published: false,
},
},
},
include: {
posts: true,
},
})
prisma CLI
"prebuild": "rimraf dist && npx prisma generate" // 기존 컴파일 삭제 및 prisma 객체 생성 (model 변경시 필수 실행 명령어)
"db-pull": "npx prisma db pull", // db 변경사항을 schema.prisma에 업데이트
"db-push": "npx prisma db push", // schema.prisma 변경사항을 db에 적용
반응형