drizzle-kit migrate

This guide assumes familiarity with:

drizzle-kit migratedrizzle-kit generate로 생성된 SQL 마이그레이션을 적용할 수 있게 해줍니다. 이 명령어는 Drizzle 마이그레이션을 관리하는 코드 우선(옵션 3) 접근 방식을 다룹니다.

내부 동작 원리

Drizzle Kit migrate 명령어는 다음과 같은 일련의 이벤트를 트리거합니다:

  1. 마이그레이션 폴더를 읽고 모든 .sql 마이그레이션 파일을 확인합니다.
  2. 데이터베이스에 연결하고 Drizzle 마이그레이션 로그 테이블에서 항목을 가져옵니다.
  3. 이전에 적용된 마이그레이션을 기반으로 새로운 마이그레이션을 결정합니다.
  4. SQL 마이그레이션을 실행하고 적용된 마이그레이션을 Drizzle 마이그레이션 테이블에 기록합니다.
  ├ 📂 drizzle       
  │ ├ 📂 _meta
  │ ├ 📜 0000_premium_mister_fear.sql
  │ └ 📜 0001_delicate_professor_xavie.sql
  └ …
┌───────────────────────┐                  
│ $ drizzle-kit migrate │                  
└─┬─────────────────────┘                  
  │                                                         ┌──────────────────────────┐                                         
  └ 1. 마이그레이션 폴더에서 migration.sql 파일을 읽음       │                          │
    2. 데이터베이스에서 마이그레이션 기록을 가져옴 ---------> │         DATABASE         │
  ┌ 3. 이전에 적용되지 않은 마이그레이션을 선택 <----------- │                          │
  └ 4. 새로운 마이그레이션을 데이터베이스에 적용 ----------> │                          │
                                                            │                          │
                                                            └──────────────────────────┘
[✓] 완료!        

drizzle-kit migrate 명령어를 사용하려면 dialect와 데이터베이스 연결 정보를 지정해야 합니다. 이 정보는 drizzle.config.ts 설정 파일을 통해 제공하거나 CLI 옵션으로 제공할 수 있습니다.

설정 파일 사용
CLI 옵션 사용
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "postgresql",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname"
  },
});
npx drizzle-kit migrate

데이터베이스에 적용된 마이그레이션 로그

마이그레이션을 실행하면 Drizzle Kit은 성공적으로 적용된 마이그레이션에 대한 기록을 데이터베이스에 저장합니다. 이 기록은 __drizzle_migrations라는 이름의 마이그레이션 로그 테이블에 저장됩니다.

여러분은 Drizzle 설정 파일을 통해 이 테이블의 이름스키마(PostgreSQL 전용)를 커스터마이징할 수 있습니다:

drizzle.config.ts
export default defineConfig({
  dialect: "postgresql",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname"
  },
  migrations: {
    table: 'my-migrations-table', // 기본값은 `__drizzle_migrations`
    schema: 'public', // PostgreSQL 전용, 기본값은 `drizzle`
  },
});

하나의 프로젝트에 여러 설정 파일 사용하기

하나의 프로젝트에서 여러 설정 파일을 사용할 수 있습니다. 이는 여러 데이터베이스 단계나 동일한 프로젝트 내에서 여러 데이터베이스를 관리할 때 매우 유용합니다.

npx drizzle-kit migrate --config=drizzle-dev.config.ts
npx drizzle-kit migrate --config=drizzle-prod.config.ts
📦 <project root>
 ├ 📂 drizzle
 ├ 📂 src
 ├ 📜 .env
 ├ 📜 drizzle-dev.config.ts
 ├ 📜 drizzle-prod.config.ts
 ├ 📜 package.json
 └ 📜 tsconfig.json

위 예제에서 볼 수 있듯이, drizzle-dev.config.tsdrizzle-prod.config.ts라는 두 개의 설정 파일을 사용하여 개발 환경과 프로덕션 환경을 각각 관리할 수 있습니다. 이렇게 하면 환경에 따라 다른 설정을 쉽게 적용할 수 있습니다.

확장 예제

drizzle-kit generatedrizzle-kit migrate 커맨드를 사용하여 SQL 마이그레이션을 생성하고 데이터베이스에 적용해 보겠습니다.

📦 <project root>
 ├ 📂 drizzle
 ├ 📂 src
 │ ├ 📜 schema.ts
 │ └ 📜 index.ts
 ├ 📜 drizzle.config.ts
 └ …
drizzle.config.ts
src/schema.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "postgresql",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname"
  },
  migrations: {
    table: 'journal', 
    schema: 'drizzle', 
  },
});

이제 다음 커맨드를 실행합니다.

npx drizzle-kit generate --name=init

이 명령어는 다음과 같은 파일을 생성합니다.

📦 <project root>
 ├ …
 ├ 📂 migrations
 │ ├ 📂 _meta
 │ └ 📜 0000_init.sql 
 └ …
-- ./drizzle/0000_init.sql

CREATE TABLE "users"(
  id serial primary key,
  name text,
)

이제 다음 커맨드를 실행합니다.

npx drizzle-kit migrate

이제 SQL 마이그레이션이 데이터베이스에 성공적으로 적용되었습니다 ✅