drizzle-kit push

This guide assumes familiarity with:

drizzle-kit push는 SQL 파일 생성을 생략하고 스키마와 후속 스키마 변경 사항을 데이터베이스에 직접 푸시할 수 있게 해줍니다. Drizzle 마이그레이션의 코드 우선 접근 방식을 위해 설계되었습니다.

내부 동작 방식

Drizzle Kit push 명령을 실행하면 다음과 같이 동작합니다:

  1. Drizzle 스키마 파일을 읽고 스키마의 JSON 스냅샷을 구성합니다
  2. 데이터베이스 스키마를 풀(인트로스펙션)합니다
  3. 두 스키마의 차이를 기반으로 SQL 마이그레이션을 생성합니다
  4. 데이터베이스에 SQL 마이그레이션을 적용합니다
src/schema.ts
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
};
┌─────────────────────┐                  
│ ~ drizzle-kit push  │                  
└─┬───────────────────┘                  
  │                                           ┌──────────────────────────┐
  └ 현재 데이터베이스 스키마 풀(Pull) --------> │                          │
                                              │                          │
  ┌ 차이를 기반으로 변경사항 생성 <------------ │         DATABASE         │
  │                                           │                          │
  └ 데이터베이스에 마이그레이션 적용 --------> │                          │
                                       │      └──────────────────────────┘

  ┌────────────────────────────────────┴────────────────┐
   create table users(id serial primary key, name text);

빠른 프로토타이핑을 위한 최고의 접근 방식이며, 수많은 팀과 개발자들이 프로덕션 애플리케이션에서 주요 마이그레이션 플로우로 성공적으로 사용하고 있습니다. 블루/그린 배포 전략 및 Planetscale, Neon, Turso와 같은 서버리스 데이터베이스와 매우 잘 어울립니다.




drizzle-kit pushdialect, schema 파일 경로, 그리고 데이터베이스 연결 url 또는 user:password@host:port/db 파라미터를 지정해야 합니다. 이들은 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 push

스키마 파일 경로

단일 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",
});

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

프로젝트에서 여러 설정 파일을 사용할 수 있으며, 여러 데이터베이스 스테이지나 여러 데이터베이스, 또는 같은 프로젝트에서 서로 다른 데이터베이스를 사용할 때 매우 유용합니다:

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

데이터베이스 드라이버 지정

IMPORTANT

Expo SQLiteOP SQLite는 온디바이스(사용자별) 데이터베이스로, 마이그레이션을 push할 방법이 없습니다.
임베디드 데이터베이스의 경우 Drizzle은 embedded migrations를 제공합니다 - 시작하기 가이드를 확인하세요.

Drizzle Kit은 사전 번들된 데이터베이스 드라이버를 포함하지 않으며, dialect를 기반으로 현재 프로젝트에서 사용 가능한 데이터베이스 드라이버를 자동으로 선택합니다 - 논의 참조.

대부분의 동일한 dialect 드라이버는 동일한 연결 파라미터 세트를 공유하지만, aws-data-api, pglight, d1-http와 같은 예외의 경우 명시적으로 driver 파라미터를 지정해야 합니다.

AWS Data API
PGLite
Cloudflare D1 HTTP
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",
  },
});

테이블, 스키마, 확장 포함하기

drizzle-kit push는 기본적으로 public 스키마의 모든 테이블을 관리합니다. tablesFilters, schemaFilter, extensionFilters 옵션을 통해 테이블, 스키마, 확장 목록을 설정할 수 있습니다.

tablesFilterglob 기반 테이블 이름 필터, 예: ["users", "user_info"] 또는 "user*". 기본값은 "*"
schemaFilter스키마 이름 필터, 예: ["public", "drizzle"]. 기본값은 ["public"]
extensionsFilters설치된 데이터베이스 확장 목록, 예: ["postgis"]. 기본값은 []

public 스키마의 모든 테이블에만 작동하도록 drizzle-kit을 설정하고, public 스키마에 자체 테이블을 생성하는 postgis 확장이 설치되어 있음을 drizzle-kit에 알려서 drizzle이 이를 무시하도록 하겠습니다.

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",
  },
  extensionsFilters: ["postgis"],
  schemaFilter: ["public"],
  tablesFilter: ["*"],
});
npx drizzle-kit push

확장 설정 목록

drizzle-kit push는 CLI 전용 옵션 목록을 제공합니다

verbose실행 전 모든 SQL 구문 출력
strictSQL 구문 실행 전 항상 승인 요청
force모든 데이터 손실 구문 자동 승인

npm
yarn
pnpm
bun
npx drizzle-kit push --strict --verbose --force



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

dialectrequired데이터베이스 dialect, postgresql mysql sqlite turso singlestore mssql cockroachdb 중 하나
schemarequiredTypeScript 스키마 파일 또는 여러 스키마 파일이 있는 폴더 경로
driver드라이버 예외 aws-data-api d1-http pglight
tablesFilter테이블 이름 필터
schemaFilter스키마 이름 필터. 기본값: ["public"]
extensionsFilters데이터베이스 확장 내부 데이터베이스 필터
url데이터베이스 연결 문자열
user데이터베이스 사용자
password데이터베이스 비밀번호
host호스트
port포트
database데이터베이스 이름
config설정 파일 경로, 기본값=drizzle.config.ts
npm
yarn
pnpm
bun
npx drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
npx drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
npx drizzle-kit push dialect=postgresql schema=src/schema.ts --tablesFilter=‘user*’ --extensionsFilters=postgis url=postgresql://user:password@host:port/dbname

확장 예제

프로젝트에서 drizzle 스키마를 선언하고 drizzle-kit push 명령을 통해 데이터베이스에 푸시해보겠습니다

📦 <project root>
 ├ 📂 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"
  },
});

이제 다음 명령을 실행합니다

npx drizzle-kit push

데이터베이스에서 기존(빈) 스키마를 풀하고 SQL 마이그레이션을 생성한 후 내부적으로 적용합니다

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

완료 ✅