drizzle-kit migrate

This guide assumes familiarity with:

drizzle-kit migrate 명령어는 drizzle-kit generate로 생성된 SQL 마이그레이션을 데이터베이스에 적용합니다. 이 명령어는 Drizzle 마이그레이션을 관리하는 코드 우선 접근 방식(옵션 3)을 지원하도록 설계되었습니다.

내부적으로 어떻게 동작하나요?

Drizzle Kit의 migrate 명령어는 다음과 같은 일련의 과정을 실행합니다:

  1. 마이그레이션 폴더를 탐색하여 모든 .sql 마이그레이션 파일을 읽습니다
  2. 데이터베이스에 연결하여 Drizzle 마이그레이션 로그 테이블에서 항목을 가져옵니다
  3. 이전에 적용된 마이그레이션을 기반으로 실행할 새로운 마이그레이션을 결정합니다
  4. SQL 마이그레이션을 실행하고 적용된 마이그레이션을 Drizzle 마이그레이션 테이블에 기록합니다
  ├ 📂 drizzle       
  │ ├ 📂 20242409125510_premium_mister_fear
  │ └ 📂 20242409135510_delicate_professor_xavie
  └ …
┌───────────────────────┐                  
│ $ drizzle-kit migrate │                  
└─┬─────────────────────┘                  
  │                                                         ┌──────────────────────────┐                                         
  └ 1. reads migration.sql files in migrations folder       │                          │
    2. fetch migration history from database -------------> │                          │
  ┌ 3. pick previously unapplied migrations <-------------- │         DATABASE         │
  └ 4. apply new migration to the database ---------------> │                          │
                                                            │                          │
                                                            └──────────────────────────┘
[✓] done!        

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 설정 파일을 통해 해당 테이블의 tableschema(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` by default
    schema: 'public', // used in PostgreSQL only, `drizzle` by default
  },
});

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

프로젝트에 여러 개의 설정 파일을 사용할 수 있으며, 이는 여러 데이터베이스 환경(개발/운영 등) 또는 동일한 프로젝트에 여러 데이터베이스가 있을 때 매우 유용합니다:

npm
yarn
pnpm
bun
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-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
 │ ├ 📂 20242409125510_init
 └ …
-- ./drizzle/0000_init.sql

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

이제 다음 명령어를 실행해봅시다

npx drizzle-kit migrate

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