얼마 전, 특정 DB schema와 prisma schema를 동기화해야 하는 일이 있었기에 해당 방법을 기록해 둔다.
해당 방법은 다음과 같은 상황에 쓰일 수 있을 것 같다.
빠르게 예시로 봐보자.
개발을 위해 User와 Cart의 모델을 prisma schema에 정의했다.
model User {
id Int @id @default(autoincrement())
name String
phoneNumber String @map("phone_number")
cart Cart?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("user")
}
model Cart {
id Int @id @default(autoincrement())
userId Int @unique @map("user_id")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
user User @relation(fields: [userId], references: [id])
@@map("cart")
}
그리고 생성한 PrismaClient를 통해 휴대폰번호로 사용자를 찾는다고 가정해보자.
getHello(): string {
const prisma = new PrismaClient();
prisma.user.findFirst({
where: { phoneNumber: '' }
});
return 'Hello World!';
};
근데 누군가 이메일로 찾겠다고 DB에서 phoneNumber 컬럼을 없애고 email 컬럼을 추가했다고 한다.
model User {
id Int @id @default(autoincrement())
name String
email String <---- 변경
cart Cart?
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
@@map("user")
}
model Cart {
id Int @id @default(autoincrement())
userId Int @unique @map("user_id")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
user User @relation(fields: [userId], references: [id])
@@map("cart")
}
원래는 변경된 부분이 반영돼서 위와 같이 prisma schema가 정의되어 있어야 하나, 지금은 초기에 작성한 phoneNumber 컬럼이 나의 prisma schema 파일에 그대로 남아 있을 것이다.
prisma schema을 동기화하기 위해 마이그레이션 파일을 봤더니, 직접 변경하여 존재하지 않는다.
이때, 어떻게 변경된 DB의 schema와 나의 prisma schema를 동기화할 수 있을까?
prisma generate를 수행했지만 이 명령어는 수행 시점의 prisma schema(prisma/prisma.schema) 정보로 PrismaClient를 생성해주기 때문에, 몇번을 시도해도 phoneNumber 컬럼이 존재하는 prisma schema를 참조할 것이다.
이때, prisma Introspection이란 개념이 등장한다.
prisma Introspection은 기존 DB schema를 프로젝트(애플리케이션)의 prisma schema로 가져오는 것이다.
그리고 이 개념은 prisma db pull 명령을 통해 수행할 수 있는데, 어느 DB에 연결해서 schema를 가져올 것인지만 작성해주면 된다.
세팅하고 수행해 보면...
성공적으로 명령어가 수행되어 반영되는 것을 볼 수 있다.
다만, prisma schema에 반영하면서 변경하지 않아도 되는 부분까지 prisma 규칙에 따라 변경되므로 변경 부분을 확인하고 싶다면 수행하기 전에 커밋을 해두는 것을 추천한다.