하나의 데이터베이스로 여러 프로젝트를 실행하고 싶다면 가이드를 확인해 보세요.
Drizzle Kit 설정 파일
Drizzle Kit은 TypeScript
또는 JavaScript
설정 파일에서 옵션을 선언할 수 있게 해줍니다.
📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
├ 📜 drizzle.config.ts
└ 📜 package.json
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
out: "./drizzle",
});
확장된 설정 파일 예제:
import { defineConfig } from "drizzle-kit";
export default defineConfig({
out: "./drizzle",
dialect: "postgresql",
schema: "./src/schema.ts",
driver: "pglite",
dbCredentials: {
url: "./database/",
},
extensionsFilters: ["postgis"],
schemaFilter: "public",
tablesFilter: "*",
introspect: {
casing: "camel",
},
migrations: {
prefix: "timestamp",
table: "__drizzle_migrations__",
schema: "public",
},
entities: {
roles: {
provider: '',
exclude: [],
include: []
}
},
breakpoints: true,
strict: true,
verbose: true,
});
여러 개의 설정 파일 사용하기
프로젝트에서 여러 개의 설정 파일을 사용할 수 있습니다. 이는 여러 데이터베이스 단계나 여러 데이터베이스, 또는 동일한 프로젝트 내에서 다른 데이터베이스를 사용할 때 매우 유용합니다.
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-dev.config.ts
와 drizzle-prod.config.ts
두 개의 설정 파일을 사용하여 개발 환경과 프로덕션 환경에 각각 다른 설정을 적용할 수 있습니다.
마이그레이션 폴더
out
파라미터를 사용하면 마이그레이션 파일을 저장할 폴더를 지정할 수 있습니다. 이 파라미터는 선택 사항이며, 기본값은 drizzle
입니다.
이 기능은 동일한 프로젝트 내에서 여러 데이터베이스에 대한 별도의 스키마를 가질 때 매우 유용합니다. 각 데이터베이스마다 다른 마이그레이션 폴더를 지정할 수 있기 때문입니다.
마이그레이션 폴더에는 .sql
마이그레이션 파일과 drizzle-kit
에서 사용하는 _meta
폴더가 포함됩니다.
📦 <project root>
├ ...
├ 📂 drizzle
│ ├ 📂 _meta
│ ├ 📜 user.ts
│ ├ 📜 post.ts
│ └ 📜 comment.ts
├ 📂 src
├ 📜 drizzle.config.ts
└ 📜 package.json
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql", // "mysql" | "sqlite" | "postgresql" | "turso" | "singlestore"
schema: "./src/schema/*",
out: "./drizzle",
});
---
dialect
사용 중인 데이터베이스의 방언(dialect)을 설정합니다.
타입 | <Dialects/> |
기본값 | — |
커맨드 | generate migrate push pull check up |
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "mysql",
});
schema
glob
패턴을 기반으로 Drizzle 스키마 파일이나 스키마 파일이 포함된 폴더 경로를 지정합니다.
타입 | string string[] |
기본값 | — |
명령어 | generate push |
📦 <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",
});
out
SQL 마이그레이션 파일, 스키마의 JSON 스냅샷, 그리고 drizzle-kit pull
커맨드로 생성된 schema.ts
파일의 출력 폴더를 정의합니다.
타입 | string string[] |
기본값 | drizzle |
지원 커맨드 | generate migrate push pull check up |
import { defineConfig } from "drizzle-kit";
export default defineConfig({
out: "./drizzle",
});
driver
Drizzle Kit은 제공된 dialect
를 기반으로 현재 프로젝트에서 사용 가능한 데이터베이스 드라이버를 자동으로 선택합니다.
하지만 일부 벤더별 데이터베이스는 연결 매개변수의 다른 하위 집합을 필요로 합니다.
driver
옵션을 사용하면 이러한 예외적인 드라이버를 명시적으로 선택할 수 있습니다.
타입 |
위 코드는 |
기본값 | — |
명령어 | migrate push pull |
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
driver: "aws-data-api",
dbCredentials: {
database: "database",
resourceArn: "resourceArn",
secretArn: "secretArn",
},
});
---
dbCredentials
데이터베이스 연결 정보를 url
형식이나 user:password@host:port/db
파라미터, 또는 드라이버별 연결 옵션으로 제공합니다.
타입 | 드라이버별 연결 옵션의 유니온 타입 |
기본값 | — |
사용 가능한 커맨드 | migrate , push , pull |
import { defineConfig } from 'drizzle-kit'
export default defineConfig({
dialect: "postgresql",
dbCredentials: {
url: "postgres://user:password@host:port/db",
}
})
import { defineConfig } from 'drizzle-kit'
// 연결 파라미터를 통해 설정
export default defineConfig({
dialect: "postgresql",
dbCredentials: {
host: "host",
port: 5432,
user: "user",
password: "password",
database: "dbname",
ssl: true, // boolean | "require" | "allow" | "prefer" | "verify-full" | node:tls 옵션
}
})
migrations
drizzle-kit migrate
명령어를 실행하면, Drizzle은 성공적으로 적용된 마이그레이션에 대한 기록을 데이터베이스에 저장합니다. 이 기록은 PostgreSQL의 경우 public
스키마에 있는 __drizzle_migrations
라는 로그 테이블에 저장됩니다.
migrations
설정 옵션을 사용하면 마이그레이션 로그 테이블의 이름과 스키마를 변경할 수 있습니다.
타입 | { table: string, schema: string } |
기본값 | { table: "__drizzle_migrations", schema: "drizzle" } |
명령어 | migrate |
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
migrations: {
table: 'my-migrations-table', // 기본값은 `__drizzle_migrations`
schema: 'public', // PostgreSQL에서만 사용되며, 기본값은 `drizzle`
},
});
introspect
drizzle-kit pull
커맨드에 대한 설정입니다.
casing
은 코드 내 컬럼 키의 표기 방식을 결정합니다.
타입 | { casing: "preserve" | "camel" } |
기본값 | { casing: "camel" } |
커맨드 | pull |
import * as p from "drizzle-orm/pg-core"
export const users = p.pgTable("users", {
id: p.serial(),
firstName: p.text("first-name"),
lastName: p.text("LastName"),
email: p.text(),
phoneNumber: p.text("phone_number"),
});
SELECT a.attname AS column_name, format_type(a.atttypid, a.atttypmod) as data_type FROM pg_catalog.pg_attribute a;
column_name | data_type
---------------+------------------------
id | serial
first-name | text
LastName | text
email | text
phone_number | text
---
tablesFilter
drizzle-kit push
와 drizzle-kit pull
은 기본적으로 public
스키마의 모든 테이블을 관리합니다.
tablesFilters
, schemaFilter
, extensionFilters
옵션을 통해 테이블 목록, 스키마, 확장 기능을 설정할 수 있습니다.
tablesFilter
옵션은 glob
기반의 테이블 이름 필터를 지정할 수 있게 해줍니다. 예를 들어 ["users", "user_info"]
또는 "user*"
와 같은 형태로 사용할 수 있습니다.
타입 | string string[] |
기본값 | — |
명령어 | generate push pull |
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
tablesFilter: ["users", "posts", "project1_*"],
});
schemaFilter
하나의 데이터베이스로 여러 프로젝트를 실행하고 싶다면 가이드를 확인해 보세요.
drizzle-kit push
와 drizzle-kit pull
은 기본적으로 public
스키마의 모든 테이블을 관리합니다.
tablesFilters
, schemaFilter
, extensionFilters
옵션을 통해 테이블, 스키마, 확장 기능 목록을 설정할 수 있습니다.
schemaFilter
옵션은 Drizzle Kit이 관리할 스키마 목록을 지정할 수 있게 해줍니다.
타입 | string[] |
기본값 | ["public"] |
명령어 | generate , push , pull |
export default defineConfig({
dialect: "postgresql",
schemaFilter: ["public", "schema1", "schema2"],
});
extensionsFilters
postgis
와 같은 일부 확장 기능은 데이터베이스에 설치될 때, 공개 스키마(public schema)에 자체 테이블을 생성합니다. 이러한 테이블은 drizzle-kit push
나 drizzle-kit pull
에서 무시되어야 합니다.
extensionsFilters
옵션을 사용하면, 설치된 확장 기능 목록을 선언하여 스키마에서 해당 테이블을 무시하도록 설정할 수 있습니다.
타입 | ["postgis"] |
기본값 | [] |
지원 커맨드 | push pull |
export default defineConfig({
dialect: "postgresql",
extensionsFilters: ["postgis"],
});
---
entities
이 설정은 데이터베이스 내 특정 엔티티(entities)
를 관리하기 위한 설정을 구성하는 데 사용됩니다.
현재는 역할(roles)
만 포함되어 있지만, 앞으로 테이블(tables)
, 스키마(schemas)
, 확장 기능(extensions)
, 함수(functions)
, 트리거(triggers)
등 모든 데이터베이스 엔티티가 이곳으로 이전될 예정입니다.
roles
Drizzle Kit을 사용해 스키마와 특히 정의된 역할(roles)을 관리할 때, Drizzle 스키마에 정의되지 않은 역할이 있을 수 있습니다. 이런 경우, Drizzle Kit이 해당 역할을 건너뛰도록 설정할 수 있습니다. 이렇게 하면 각 역할을 Drizzle 스키마에 작성하고 .existing()
으로 표시할 필요가 없습니다.
roles
옵션을 사용하면 다음과 같은 작업을 할 수 있습니다:
- Drizzle Kit의 역할 관리 기능을 활성화하거나 비활성화할 수 있습니다.
- 특정 역할을 Drizzle Kit의 관리에서 제외할 수 있습니다.
- 특정 역할을 Drizzle Kit의 관리에 포함시킬 수 있습니다.
Neon
이나Supabase
와 같은 프로바이더의 특정 역할을 관리하지 않는 모드를 활성화할 수 있습니다.- 위의 모든 옵션을 조합하여 사용할 수 있습니다.
타입 | boolean | { provider: "neon" | "supabase", include: string[], exclude: string[]} |
기본값 | false |
명령어 | push pull generate |
기본적으로 drizzle-kit
은 역할을 관리하지 않으므로, 이를 활성화해야 합니다. drizzle.config.ts
파일에서 다음과 같이 설정할 수 있습니다.
export default defineConfig({
dialect: "postgresql",
extensionsFilters: entities: {
roles: true
}
});
admin
역할을 관리 가능한 역할 목록에서 제외하려는 경우
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
...
entities: {
roles: {
exclude: ['admin']
}
}
});
admin
역할을 관리 가능한 역할 목록에 포함하려는 경우
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
...
entities: {
roles: {
include: ['admin']
}
}
});
Neon
을 사용 중이고, Neon
에서 정의한 역할을 제외하려는 경우
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
...
entities: {
roles: {
provider: 'neon'
}
}
});
Supabase
를 사용 중이고, Supabase
에서 정의한 역할을 제외하려는 경우
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
...
entities: {
roles: {
provider: 'supabase'
}
}
});
데이터베이스 프로바이더가 지정한 새로운 역할에 비해 Drizzle이 약간 뒤처지는 상황이 발생할 수 있습니다. 이 경우 provider
옵션과 함께 추가 역할을 exclude
로 제외해야 할 수 있습니다. Drizzle을 사용하면 이를 쉽게 처리할 수 있습니다.
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
...
entities: {
roles: {
provider: 'supabase',
exclude: ['new_supabase_role']
}
}
});
---
strict
drizzle-kit push
명령어를 실행할 때, 출력된 SQL 문을 실행하기 전에 확인을 요청합니다.
타입 | boolean |
기본값 | false |
명령어 | push |
export default defineConfig({
dialect: "postgresql",
breakpoints: false,
});
verbose
drizzle-kit push
명령어 실행 시 모든 SQL 문을 출력합니다.
타입 | boolean |
기본값 | true |
명령어 | generate pull |
export default defineConfig({
dialect: "postgresql",
breakpoints: false,
});
breakpoints
Drizzle Kit은 자동으로 생성된 SQL 마이그레이션 파일에 --> statement-breakpoint
를 삽입합니다. 이는 MySQL과 SQLite처럼 하나의 트랜잭션에서 여러 DDL 변경 문을 지원하지 않는 데이터베이스에 필요합니다.
breakpoints
옵션 플래그를 사용하면 이 기능을 켜거나 끌 수 있습니다.
타입 | boolean |
기본값 | true |
명령어 | generate , pull |
export default defineConfig({
dialect: "postgresql",
breakpoints: false,
});