One Server

문서

마이그레이션과 타입

스키마 변경을 버전 붙은 SQL로 적용하고 기록하기, 스키마를 SQL로 내려받기, supabase-js용 TypeScript 타입 만들기.

마이그레이션과 타입

스키마를 바꾸는 SQL을 버전이 붙은 파일로 남겨 두면, 같은 변경을 다른 프로젝트(스테이징 → 프로덕션)에 같은 순서로 다시 적용할 수 있어요. run_sql로 바꾼 것은 기록이 남지 않아요.

list_migrations             적용한 마이그레이션의 버전·이름·시각 (오래된 순)
apply_migrations            적용하지 않은 것만 버전 순서대로 실행하고 기록
remove_migration_record     기록 하나 지우기 (만든 것은 그대로)
dump_schema                 지금 스키마를 다시 만들 수 있는 SQL로
generate_typescript_types   supabase-js의 Database 타입

적용되는 방식

  • 마이그레이션 하나가 트랜잭션 하나예요. 실패하면 그 마이그레이션만 통째로 되돌리고 멈춰요.
  • 버전은 숫자이고(보통 YYYYMMDDHHMMSS), 숫자 크기 순서로 실행해요. 이미 기록된 버전은 건너뛰어요.
  • 이미 적용된 마지막 버전보다 앞선 버전이 새로 오면 거절해요. 늦게 합친 브랜치라면 include_all: true.
  • 기록된 뒤 내용이 바뀐 파일은 다시 실행하지 않고 drifted로 알려 줘요. 고치려면 새 마이그레이션을 쓰세요.
  • run_sql과 같은 권한(쓰기 토큰, 소유자·관리자·개발자)으로, 프로젝트의 service_role로 실행해요.
  • 데이터 스키마가 search_path 맨 앞에 있으니 create table notes (...)처럼 이름만 쓰면 돼요.

기록은 어디에

프로젝트의 oneend_migrations 표예요. 소유자가 SQL로 읽을 수 있고, RLS가 켜져 있고 규칙이 없어서 공개 키로는 보이지 않아요. supabase_migrations.schema_migrations와 같은 역할이에요.

스키마를 파일로, 타입을 코드로

dump_schema는 타입·시퀀스·표와 제약·외래 키·인덱스·함수·뷰·트리거·RLS와 규칙을 SQL로 줘요. 이미 있는 프로젝트를 마이그레이션으로 관리하기 시작할 때, 이것을 첫 마이그레이션으로 저장하고 apply_migrations에 record_only: true로 기록만 남기세요. 실행하면 이미 있는 표와 부딪쳐요.

generate_typescript_types는 supabase gen types typescript와 같은 모양(Tables의 Row/Insert/Update/Relationships, Views, Functions의 Args/Returns, Enums, CompositeTypes)을 줘요. 스키마 이름은 public이에요.

같은 일을 HTTP로

GET    /projects/<ref>/migrations
POST   /projects/<ref>/migrations          {migrations: [{version, name, sql}], include_all, record_only, dry_run}
DELETE /projects/<ref>/migrations/<version>
GET    /projects/<ref>/schema              {sql, objects}
GET    /projects/<ref>/types/typescript?schema=public   {types}