drizzle-kit push
This guide assumes familiarity with:
drizzle-kit push는 SQL 파일 생성을 생략하고 스키마와 후속 스키마 변경 사항을 데이터베이스에 직접 푸시할 수 있게 해줍니다.
Drizzle 마이그레이션의 코드 우선 접근 방식을 위해 설계되었습니다.
Drizzle Kit push 명령을 실행하면 다음과 같이 동작합니다:
Drizzle 스키마 파일을 읽고 스키마의 JSON 스냅샷을 구성합니다
데이터베이스 스키마를 풀(인트로스펙션)합니다
두 스키마의 차이를 기반으로 SQL 마이그레이션을 생성합니다
데이터베이스에 SQL 마이그레이션을 적용합니다
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 push는 dialect, schema 파일 경로, 그리고 데이터베이스 연결 url 또는 user:password@host:port/db 파라미터를 지정해야 합니다.
이들은 drizzle.config.ts 설정 파일이나 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 npx drizzle-kit push --dialect=postgresql --schema=./src/schema.ts --url=postgresql://user:password@host:port/dbname
스키마 파일 경로
단일 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" ,
}); 📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📂 user
│ │ ├ 📜 handler.ts
│ │ └ 📜 schema.ts
│ ├ 📂 posts
│ │ ├ 📜 handler.ts
│ │ └ 📜 schema.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
schema : "./src/**/schema.ts" ,
//or
schema : [ "./src/user/schema.ts" , "./src/posts/schema.ts" ]
}); 📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📂 schema
│ │ ├ 📜 user.ts
│ │ ├ 📜 post.ts
│ │ └ 📜 comment.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
schema : "./src/schema/*" ,
}); 📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📜 userById.ts
│ ├ 📜 userByEmail.ts
│ ├ 📜 listUsers.ts
│ ├ 📜 user.sql.ts
│ ├ 📜 postById.ts
│ ├ 📜 listPosts.ts
│ └ 📜 post.sql.ts
│ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
schema : "./src/**/*.sql.ts" , // Dax's favourite
});
프로젝트에서 여러 설정 파일 사용하기
프로젝트에서 여러 설정 파일을 사용할 수 있으며, 여러 데이터베이스 스테이지나 여러 데이터베이스, 또는 같은 프로젝트에서 서로 다른 데이터베이스를 사용할 때 매우 유용합니다:
npx drizzle-kit push --config=drizzle-dev.config.ts
npx drizzle-kit push --config=drizzle-prod.config.ts
yarn drizzle-kit push --config=drizzle-dev.config.ts
yarn drizzle-kit push --config=drizzle-prod.config.ts
pnpm drizzle-kit push --config=drizzle-dev.config.ts
pnpm drizzle-kit push --config=drizzle-prod.config.ts
bunx drizzle-kit push --config=drizzle-dev.config.ts
bunx 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 SQLite 와 OP 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" ,
} ,
}); import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
dialect : "postgresql" ,
schema : "./src/schema.ts" ,
driver : "pglite" ,
dbCredentials : {
// inmemory
url : ":memory:"
// or database folder
url: "./database/"
} ,
}); import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
dialect : "sqlite" ,
schema : "./src/schema.ts" ,
driver : "d1-http" ,
dbCredentials : {
accountId : "accountId" ,
databaseId : "databaseId" ,
token : "token" ,
} ,
});
테이블, 스키마, 확장 포함하기
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이 이를 무시하도록 하겠습니다.
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모든 데이터 손실 구문 자동 승인
npx drizzle-kit push --strict --verbose --force
yarn drizzle-kit push --strict --verbose --force
pnpm drizzle-kit push --strict --verbose --force
bunx 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
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
yarn drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
yarn drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
yarn drizzle-kit push dialect=postgresql schema=src/schema.ts --tablesFilter=‘user*’ --extensionsFilters=postgis url=postgresql://user:password@host:port/dbname
pnpm drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
pnpm drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
pnpm drizzle-kit push dialect=postgresql schema=src/schema.ts --tablesFilter=‘user*’ --extensionsFilters=postgis url=postgresql://user:password@host:port/dbname
bunx drizzle-kit push dialect=postgresql schema=src/schema.ts url=postgresql://user:password@host:port/dbname
bunx drizzle-kit push dialect=postgresql schema=src/schema.ts driver=pglite url=database/
bunx 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"
} ,
}); import * as p from "drizzle-orm/pg-core" ;
export const users = p .pgTable ( "users" , {
id : p .serial () .primaryKey () ,
name : p .text () ,
})
이제 다음 명령을 실행합니다
npx drizzle-kit push
데이터베이스에서 기존(빈) 스키마를 풀하고 SQL 마이그레이션을 생성한 후 내부적으로 적용합니다
CREATE TABLE " users "(
id serial primary key ,
name text
)
완료 ✅