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.sql 및 snapshot.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 scheama
    3. prompt developer for renames if necessary
  β”Œ 4. generate SQL migration and persist to file
  β”‚    β”Œβ”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  
  β”‚      πŸ“‚ drizzle       
  β”‚      β”œ πŸ“‚ _meta
  β”‚      β”” πŸ“œ 0000_premium_mister_fear.sql
  v
-- drizzle/0000_premium_mister_fear.sql

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

Drizzle λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ΄€λ¦¬μ˜ μ½”λ“œ μš°μ„  μ ‘κ·Ό 방식을 닀루도둝 μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μƒμ„±λœ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ€ drizzle-kit migrateλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, drizzle-orm의 migrate()λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, bytebase와 같은 μ™ΈλΆ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 직접 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰ν•˜μ—¬ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

drizzle-kit generate λͺ…λ Ήμ–΄λŠ” dialect 및 schema 경둜 μ˜΅μ…˜μ„ λͺ¨λ‘ μ œκ³΅ν•΄μ•Ό ν•˜λ©°, 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
 β”‚ β”œ πŸ“‚ _meta
 β”‚ β”” πŸ“œ 0000_init.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
 β”‚ β”œ πŸ“‚ _meta
 β”‚ β”œ πŸ“œ 0000_init.sql 
 β”‚ β”” πŸ“œ 0001_seed-users.sql 
 β”œ πŸ“‚ src
 β”” …
-- ./drizzle/0001_seed-users.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 쀑 ν•˜λ‚˜
schemaν•„μˆ˜νƒ€μž…μŠ€ν¬λ¦½νŠΈ μŠ€ν‚€λ§ˆ 파일 λ˜λŠ” μ—¬λŸ¬ μŠ€ν‚€λ§ˆ 파일이 μžˆλŠ” 폴더 경둜
outλ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 좜λ ₯ 폴더, 기본값은 ./drizzle
configꡬ성 파일 경둜, 기본값은 drizzle.config.ts
breakpointsSQL λ¬Έ 쀑단점, 기본값은 true

ν™•μž₯ 예제

./src/schema.ts에 μœ„μΉ˜ν•œ Drizzle μŠ€ν‚€λ§ˆμ™€ κΈ°λ³Έ ./drizzle λŒ€μ‹  ./migrationsλΌλŠ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 폴더λ₯Ό μ‚¬μš©ν•˜μ—¬ 0001_seed-users.sqlμ΄λΌλŠ” μ΄λ¦„μ˜ μ‚¬μš©μž μ§€μ • postgresql λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” λ°©λ²•μ˜ μ˜ˆμ œμž…λ‹ˆλ‹€.

λ˜ν•œ drizzle ꡬ성 νŒŒμΌμ„ configs 폴더에 λ°°μΉ˜ν•  κ²ƒμž…λ‹ˆλ‹€.

ꡬ성 νŒŒμΌμ„ μƒμ„±ν•΄λ΄…μ‹œλ‹€:

πŸ“¦ <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
 β”‚ β”œ πŸ“‚ _meta
 β”‚ β”œ πŸ“œ 0000_init.sql 
 β”‚ β”” πŸ“œ 0001_seed-users.sql 
 β”” …
-- ./drizzle/0001_seed-users.sql

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