drizzle-kit generate

This guide assumes familiarity with:

drizzle-kit generate는 Drizzle 스키마 선언 시점 또는 이후 스키마 변경 시 SQL 마이그레이션을 생성할 수 있도록 해줍니다.

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

Drizzle Kit generate 명령은 다음과 같은 일련의 작업을 수행합니다:

  1. Drizzle 스키마 파일을 읽고 스키마의 JSON 스냅샷을 생성합니다
  2. 이전 마이그레이션 폴더를 읽고 현재 JSON 스냅샷을 가장 최근 스냅샷과 비교합니다
  3. JSON 차이를 기반으로 SQL 마이그레이션을 생성합니다
  4. 현재 타임스탬프를 이름으로 사용하여 마이그레이션 폴더에 migration.sqlsnapshot.json을 저장합니다
src/schema.ts
import * as p from "./drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
  email: p.text().unique(), 
};
┌────────────────────────┐                  
│ $ drizzle-kit generate │                  
└─┬──────────────────────┘                  

  └ 1. read previous migration folders
    2. find diff between current and previous schema
    3. prompt developer for renames if necessary
  ┌ 4. generate SQL migration and persist to file
  │    ┌─┴───────────────────────────────────────┐  
  │      📂 drizzle       
  │      └ 📂 20242409125510_premium_mister_fear
  │        ├ 📜 migration.sql
  │        └ 📜 snapshot.json
  v
-- drizzle/20242409125510_premium_mister_fear/migration.sql

CREATE TABLE "users" (
 "id" SERIAL PRIMARY KEY,
 "name" TEXT,
 "email" TEXT UNIQUE
);

코드 우선 접근 방식으로 Drizzle 마이그레이션을 관리하도록 설계되었습니다. 생성된 마이그레이션은 drizzle-kit migrate를 사용하거나, drizzle-orm의 migrate() 함수를 사용하거나, bytebase와 같은 외부 마이그레이션 도구를 사용하거나, 데이터베이스에서 직접 실행하여 적용할 수 있습니다.

drizzle-kit generate 명령은 dialectschema 경로 옵션을 모두 제공해야 합니다. drizzle.config.ts 설정 파일을 통해 제공하거나 CLI 옵션으로 제공할 수 있습니다

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

export default defineConfig({
  dialect: "postgresql",
  schema: "./src/schema.ts",
});
npx drizzle-kit generate

스키마 파일 경로

프로젝트 전체에 단일 schema.ts 파일을 사용할 수도 있고, 원하는 만큼 여러 스키마 파일로 분산시킬 수도 있습니다. Drizzle Kit은 schema 설정 옵션을 통해 glob 형식의 경로를 지정할 수 있습니다.

Example 1
Example 2
Example 3
Example 4
📦 <project root>
 ├ ...
 ├ 📂 drizzle
 ├ 📂 src
 │ ├ ...
 │ ├ 📜 index.ts
 │ └ 📜 schema.ts 
 ├ 📜 drizzle.config.ts
 └ 📜 package.json
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./src/schema.ts",
});

커스텀 마이그레이션 파일명

--name CLI 옵션을 사용하여 커스텀 마이그레이션 파일명을 지정할 수 있습니다

npx drizzle-kit generate --name=init
📦 <project root>
 ├ 📂 drizzle
 │ └ 📂 20242409125510_init
 │   ├ 📜 snapshot.json
 │   └ 📜 migration.sql
 ├ 📂 src
 └ …

프로젝트 내 여러 설정 파일

프로젝트에 여러 개의 설정 파일을 둘 수 있으며, 이는 여러 데이터베이스 환경(개발/프로덕션)을 사용하거나 동일한 프로젝트에서 서로 다른 데이터베이스를 관리할 때 매우 유용합니다:

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

커스텀 마이그레이션

Drizzle Kit이 현재 지원하지 않는 DDL 변경이나 데이터 시딩을 위해 빈 마이그레이션 파일을 생성하여 커스텀 SQL 마이그레이션을 작성할 수 있습니다. 커스텀 마이그레이션에 대한 자세한 내용은 여기를 참조하세요

drizzle-kit generate --custom --name=seed-users
📦 <project root>
 ├ 📂 drizzle
 │ ├ 📂 20242409125510_init
 │ └ 📂 20242409125510_seed-users
 ├ 📂 src
 └ …
-- ./drizzle/20242409125510_seed/migration.sql

INSERT INTO "users" ("name") VALUES('Dan');
INSERT INTO "users" ("name") VALUES('Andrew');
INSERT INTO "users" ("name") VALUES('Dandrew');

사용 가능한 설정의 전체 목록

drizzle-kit generate에서 사용할 수 있는 CLI 전용 옵션 목록입니다

custom커스텀 마이그레이션용 빈 SQL 파일 생성
name커스텀 이름으로 마이그레이션 생성
npm
yarn
pnpm
bun
npx drizzle-kit generate --name=init
npx drizzle-kit generate --name=seed_users --custom



drizzle.config.ts 파일을 통해 drizzle-kit을 설정하는 것을 권장하지만, 필요한 경우 (예: CI/CD 파이프라인) CLI를 통해 모든 설정 옵션을 직접 제공할 수 있습니다.

dialect필수데이터베이스 dialect, postgresql mysql sqlite turso singlestore mssql cockroachdb 중 하나
schema필수TypeScript 스키마 파일 또는 여러 스키마 파일이 있는 폴더 경로
out마이그레이션 출력 폴더, 기본값 ./drizzle
config설정 파일 경로, 기본값 drizzle.config.ts
breakpointsSQL 문 중단점, 기본값 true

확장 예제

./src/schema.ts에 위치한 Drizzle 스키마를 사용하고, 기본 ./drizzle 대신 ./migrations 폴더를 사용하여 0001_seed-users.sql이라는 커스텀 PostgreSQL 마이그레이션 파일을 생성하는 예제입니다.

또한 configs 폴더에 drizzle 설정 파일을 배치합니다.

설정 파일을 생성합니다:

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

export default defineConfig({
  dialect: "postgresql",
  schema: "./src/schema.ts",
  out: "./migrations",
});

이제 실행합니다

npx drizzle-kit generate --config=./configs/drizzle.config.ts --name=seed-users --custom

성공적으로 생성됩니다

📦 <project root>
 ├ …
 ├ 📂 migrations
 │ ├ 📂 20242409125510_init
 │ └ 📂 20242409125510_seed-users
 └ …
-- ./drizzle/20242409125510_seed-users/migration.sql

INSERT INTO "users" ("name") VALUES('Dan');
INSERT INTO "users" ("name") VALUES('Andrew');
INSERT INTO "users" ("name") VALUES('Dandrew');