본문 바로가기
IT/etc

Prisma 활용한 DB 변경 작업 (Mysql -> Postgresql)

by honeybear 2022. 11. 9.

안녕하세요 꿀푸입니다.

 

예약 포스팅 관련 데이터를 저장하고 관리해주는 DB 라이브러리로 Prisma를 사용하였습니다. 이유는 테이블을 객체 형식으로 생성해주어 코딩 시 오류 체크 등의 편리함, SQL 쿼리문 대신 JSON 형식의 문법을 통해서 데이터를 조작할 수 있는 등등의 장점이 있어 선택을 하였고 사용법도 매우 간편하였고요.

 

Prisma와 클라우드 기반의 PlanetScale DB를 연동하여 데이터를 저장하고 있었는데 이게 무료 Plan에서 제공하는 사용량을 초과하는 문제가 발생을 해서(언제 끊길지 모르는 불안함...) 서버 설치 방식의 Postgresql로 변경 작업을 진행하였습니다.

 

Prisma 초기 설정 및 기존 DB 접속 관련 설정이 되어 있는 상태에서 진행을 하였으며 매우 쉽게 처리할 수 있어 30분 내외로 걸린 듯 합니다.


먼저 DB 접속 관련 정보를 수정 합니다. .env에 DATABASE_URL 부분을 수정하여 줍니다.

 

DATABASE_URL="postgresql://<사용자>:<Password>@<IP:PORT>/<DB>?schema=public”

 

만약 Password에 !@# 같은 특수 문자가 있을 경우 아래처럼 오류가 발생을 하며 percent Encoding 형식으로 변환하여 입력하여야 합니다. 여기 사이트에 접속하여 각 문자열에 대해 확인 가능합니다.


  예) ! -> %21, $ -> %24

Error: P1013: The provided database string is invalid. invalid port number in database URL. Please refer to the 
documentation in https://www.prisma.io/docs/reference/database-reference/connection-urls for constructing a correct connection string. In some cases, certain characters must be escaped. Please check the string for any illegal characters.

 

다음으로 Schema 파일을 수정합니다. Provider 부분을 postgresql로 변경하여 줍니다.

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
  shadowDatabaseUrl = env("SHADOW_DATABASE_URL")
  referentialIntegrity = "prisma"
}

만약 기존 DB에서 사용하던 Data Type이 postgresql에서는 지원을 안 하는 문제가 발생된다면 아래 표를 참고해서 적절한 Type으로 변경을 해주어야 합니다.

모든 작업이 완료되면 아래 명령어로 schema 파일과 DB Schema 간 동기화를 수행해 줍니다. (테이블이 없다면 자동 생성)

 $ npx prisma db push

나머지 소스 내 데이터 조작 관련된 부분은 수정 필요 없이 제대로 작동하는 걸 볼 수 있습니다. :-)

댓글