relation에서 어떤 모델이 다른 모델에 의해 참조되고 있다면, 그 모델은 삭제하지 못한다.
삭제하려면? ⇒ 참조하는 모델도 같이 같이 삭제하는 방법!
onDelete: Cascade!
onDelete: SetNull ⇒ 참조했던 모델이 삭제되면 필드 값이 null이 됨
참조 필드를 optional로 둬야 함
Restrict(기본값): 참조 레코드가 있는 경우 삭제를 방지
NoAction: Restrict과 유사하지만 사용 중인 데이터베이스에 따라 다릅
SetDefault: 참조 필드가 기본값으로 설정
VScode Extension 설치 권장
Prisma ⇒ 문법강조, 포매팅, 자동 완성 등
SQLite Viewer ⇒ .db 파일(스키마) 시각화
fyi
page에서 import 파일 >> 해당 페이지에 접속하면 해당 파일을 실행
// 매핑 정의
model User {
id Int @id @default(autoincrement())
name String @unique
email String? @unique
}
// 객체로 데이터 조작
const user = await prisma.user.create({
data: { name: "John", email: "john@example.com" },
});
// name, email의 타입을 확인 가능
// 데이터베이스 연결 URL을 설정
DATABASE_URL="file:./dev.db" //SQLite
.env (.gitignore에 추가되어 있어야 함)
datasource db {
provider = "sqlite" // 사용할 데이터베이스 (sqlite, postgresql 등)
url = env("DATABASE_URL") // DB 위치
}
generator client {
provider = "prisma-client-js"
}
prisma/schema.prisma
model User {
id Int @id @default(autoincrement())
name String?
email String @unique
posts Post[]
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
prisma/schema.prisma
*.db
*.db-journal
.gitignore
// lib/prisma.ts
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
export default prisma;
const users = await prisma.user.findMany();
id Int @id @default(autoincrement())
createdAt DateTime @default(now())
status String @default("active")
firstName String @map("first_name")
author User @relation(fields: [authorId], references: [id])
authorId Int
model User {
id Int @id @default(autoincrement())
name String
post Post[]
likes Like[]
}
model Post {
id Int @id @default(autoincrement())
content String
User User? @relation(fields: [userId], references: [id])
userId Int?
likes Like[]
}
model Like {
postId Int
userId Int
User User @relation(fields: [userId], references: [id])
Post Post @relation(fields: [postId], references: [id])
@@id([postId, userId])
}
// 특정 이메일을 가진 사용자 조회
const user = await prisma.user.findMany({
where: {
email: "example@prisma.io",
},
});
// 여러 조건을 결합하여 필터링
const users = await prisma.user.findMany({
where: {
AND: [
{ isActive: true },
{ email: { contains: "@prisma.io" } },
],
},
});
// 사용자 이름과 이메일만 가져오기
const user = await prisma.user.findUnique({
where: { id: 1 },
select: {
name: true,
email: true,
},
});
// 사용자와 해당 사용자의 게시물(Post)을 함께 가져오기
const userWithPosts = await prisma.user.findUnique({
where: { id: 1 },
include: {
posts: true,
},
});
// 사용자 데이터를 생성일 기준으로 내림차순 정렬
const users = await prisma.user.findMany({
orderBy: {
createdAt: "desc",
},
});
// 첫 번째 페이지의 첫 10명의 사용자 가져오기
const users = await prisma.user.findMany({
take: 10,
skip: 0,
});
// 두 번째 페이지의 다음 10명의 사용자 가져오기
const nextUsers = await prisma.user.findMany({
take: 10,
skip: 10,
});
// 고유한 이메일을 가진 사용자 목록 가져오기
const uniqueEmails = await prisma.user.findMany({
distinct: ["email"],
});
model User {
SMSToken SMSToken[]
}
model SMSToken {
...
user User @relatioin(fields:[userId], references: [id]) //실제 db에는 추가ㄴㄴ
userId Int //실제 db에는 이 id필드만 추가됨
}