Backend/DB

[DB][Prisma] model & migration

Rayi 2024. 8. 23. 19:51

Prisma의 model은 DB의 schema에 해당합니다.

하나의 테이블에 들어갈 필드와 그 타입, 각 필드별로 필요한 속성 등을 명시해야 합니다.

model을 작성하면 이를 토대로 테이블을 자동 생성할 수 있습니다.

model User {
//  이름    타입    조건(attribute)
    id      String  @id
    name    String
}

model 작성방법

필드는 기본적으로 각 record가 값을 비울 수 없습니다.

만약 필드가 값을 입력하지 않아도 된다면, 타입 뒤에 물음표(?)를 추가해 optional field로 만들면 됩니다.

model User {
//  이름    타입    조건(attribute)
    id      String  @id
    name    String
    address String?  // nullable column
}

 

속성은 각 필드에 해당하는 값이 만족해야 하는 특별한 조건을 명시하는 것으로,

타입 뒤에 at(@)으로 시작하는 값들을 사용합니다.

Prisma에서 사용할 수 있는 속성 값들은 아래와 같습니다.

 

속성값 조건
@id 고유하고 식별 가능한 속성을 나타냅니다. DB의 고유키에 해당합니다.
id는 일반적으로 사용자가 직접 정의하는 것이 아닌, DB에서 자동적으로 관리하도록 합니다.
@unique 고유한 값을 가지는 속성을 나타냅니다. 하지만 식별키로 사용되지는 않습니다.
@default( ) 필드의 기본값을 지정합니다. 함수값도 사용할 수 있으며 주료 사용하는 함수는 아래와 같습니다.
- uuid( ) : 32자의 16진수 문자열 (String 일 때)
- autoincrement( ) : 하나가 생성될 때 마다 자동으로 1씩 증가 (Int 일 때)
- now( ) : 현재 시각 (DateTime 일 때)
@updatedAt 해당 필드는 항목이 업데이트된 시각을 표시합니다.
@relation( ) 다른 model과 관계를 만듭니다. 아래 두 값을 매개변수로 받습니다.
- fields : foreign key로 사용할 필드
- references : 상대 model에서 참조할 필드
- onDelete : 참조되는 record가 삭제될 때 참조하는 record를 처리하는 방식
  ㄴ Cascade    | 함께 삭제
  ㄴ Restrict      | 삭제하지 못하게 함
  ㄴ SetNull      | foreign key만 null로 설정함 (기본값)
  ㄴ SetDefault | foreign key에서 설정한 @default 값으로 설정
@@unique([ ]) 필드 뒤에 작성하지 않고 model의 맨 아래 부분에 작성합니다.
둘 이상의 필드 조합이 고유한 값을 가져야 할 때 사용합니다.

 

이를 이용해 아래와 같이 속성을 지정할 수 있습니다.

model User {
  id        String  @id @default(uuid()) // uuid를 값으로 하는 고유키
  email     String  @unique              // 이메일은 중복 불가능
  firstName String
  lastName  String
  address   String?                      // nullable 필드
  createdAt DateTime @default(now())     // 만들어진 시각을 기본값으로
  updatedAt  DateTime
  
  @@unique([firstName, lastName])        // firstName과 lastName 조합이 고유해야 함
}

Migration ( Prisma → SQL )

model을 작성했다면, 이를 실제 sql 코드로 마이그레이션 할 수 있습니다.

프로젝트 경로에서 아래 명령어를 실행해줍니다.

$ npx prisma migrate dev

성공적으로 실행된다면, 아래와 같이 새로운 마이그레이션 이름을 물어봅니다.

마이그레이션 이름은 생성되는 SQL 파일의 폴더에 표시되기 때문에,

git의 commit log 처럼 변경 사항을 나타내는 용도로 사용할 수도 있습니다.

일반적으로 첫 마이그레이션의 이름은 init으로 합니다.

 

***

만약 다음과 같은 에러가 발생했다면(Windows 10 기준), 여기를 참고

Error: P1001: Can't reach database server at `localhost:5432`

Please make sure your database server is running at `localhost:5432`.

***

 

마이그레이션이 완료되면 아래와 같은 문구가 출력되고,

prisma 폴더에 YYYYMMDDHHMMSS_init / migration.sql 이라는 파일이 새로 생성됩니다.

migration.sql에서는 이전에 Prisma로 작성한 코드를 토대로 SQL 코드가 작성된 것을 확인할 수 있습니다.

(좌) Prisma 코드 (우) 마이그레이션된 SQL 코드

마지막으로 만약 이미 마이그레이션했던 model에 새로운 필드를 추가하려고 한다면,

반드시 @default로 기본값을 지정하거나 물음표(?)를 추가해 optional field로 만들어주어야 합니다.

그렇지 않으면 DB의 record에 값을 가지지 않는 필드가 추가되어 오류가 발생하게 됩니다.

 

반대로 기존에 있던 필드를 제거하는 경우는 문제가 되지 않습니다.

728x90