타입 API

selectinsert 쿼리를 위해 테이블 스키마에서 타입을 가져오려면, 타입 헬퍼를 사용할 수 있습니다.

PostgreSQL
MySQL
SQLite
SingleStore
import { serial, text, pgTable } from 'drizzle-orm/pg-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'

const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
});

type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;
// 또는
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// 또는
type SelectUser = InferSelectModel;
type InsertUser = InferInsertModel;

로깅

기본 쿼리 로깅을 활성화하려면 drizzle 초기화 함수에 { logger: true }를 전달하면 됩니다:

import { drizzle } from 'drizzle-orm/...'; // 드라이버에 따라 다름

const db = drizzle({ logger: true });

로그 출력 위치를 변경하려면 DefaultLogger 인스턴스를 생성하고 커스텀 writer를 제공하면 됩니다:

import { DefaultLogger, LogWriter } from 'drizzle-orm/logger';
import { drizzle } from 'drizzle-orm/...'; // 드라이버에 따라 다름

class MyLogWriter implements LogWriter {
  write(message: string) {
    // 파일, stdout 등에 로그를 기록
  }
}

const logger = new DefaultLogger({ writer: new MyLogWriter() });
const db = drizzle({ logger });

커스텀 로거를 직접 만들 수도 있습니다:

import { Logger } from 'drizzle-orm/logger';
import { drizzle } from 'drizzle-orm/...'; // 드라이버에 따라 다름

class MyLogger implements Logger {
  logQuery(query: string, params: unknown[]): void {
    console.log({ query, params });
  }
}

const db = drizzle({ logger: new MyLogger() });

다중 프로젝트 스키마

테이블 생성자 API를 사용하면 커스텀 테이블 이름을 정의할 수 있습니다.
이 기능은 여러 프로젝트의 스키마를 하나의 데이터베이스에 유지해야 할 때 매우 유용합니다.

PostgreSQL
MySQL
SQLite
SingleStore
import { serial, text, pgTableCreator } from 'drizzle-orm/pg-core';

const pgTable = pgTableCreator((name) => `project1_${name}`);

const users = pgTable('users', {
  id: serial('id').primaryKey(),
  name: text('name').notNull(),
});
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./src/schema/*",
  out: "./drizzle",
  dialect: "mysql", 
  dbCredentials: {
    url: process.env.DATABASE_URL,
  }
  tablesFilter: ["project1_*"],
});

여러 개의 or 필터를 적용할 수도 있습니다:

tablesFilter: ["project1_*", "project2_*"]

SQL 쿼리 출력하기

SQL 쿼리는 db 인스턴스를 사용하거나 **독립형 쿼리 빌더**를 통해 출력할 수 있습니다.

const query = db
  .select({ id: users.id, name: users.name })
  .from(users)
  .groupBy(users.id)
  .toSQL();
// query:
{
  sql: 'select 'id', 'name' from 'users' group by 'users'.'id'',
  params: [],
}

Raw SQL 쿼리 실행

drizzle-orm이 아직 처리할 수 없는 복잡한 쿼리를 실행해야 한다면, db.execute 메서드를 사용해 파라미터화된 Raw SQL 쿼리를 실행할 수 있습니다.

PostgreSQL
MySQL
SQLite
SingleStore
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: postgres.RowList[]> = await db.execute(statement)

독립 실행형 쿼리 빌더

Drizzle ORM은 데이터베이스 인스턴스를 생성하지 않고도 쿼리를 작성하고 생성된 SQL을 얻을 수 있는 독립 실행형 쿼리 빌더를 제공합니다.

PostgreSQL
MySQL
SQLite
SingleStore
import { QueryBuilder } from 'drizzle-orm/pg-core';

const qb = new QueryBuilder();

const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();

타입이 지정된 테이블 컬럼 가져오기

특정 컬럼을 선택에서 제외해야 할 때 유용하게 사용할 수 있는 타입이 지정된 테이블 컬럼 맵을 가져올 수 있습니다.

PostgreSQL
MySQL
SQLite
SingleStore
index.ts
schema.ts
import { getTableColumns } from "drizzle-orm";
import { user } from "./schema";

// user 테이블의 컬럼을 가져옴
const { password, role, ...rest } = getTableColumns(user);

// password와 role을 제외한 나머지 컬럼을 선택
await db.select({ ...rest }).from(users);

테이블 정보 가져오기

PostgreSQL
MySQL
SQLite
SingleStore
import { getTableConfig, pgTable } from 'drizzle-orm/pg-core';

export const table = pgTable(...);

const {
  columns,       // 컬럼 정보
  indexes,       // 인덱스 정보
  foreignKeys,   // 외래 키 정보
  checks,        // 체크 제약 조건
  primaryKeys,   // 기본 키 정보
  name,          // 테이블 이름
  schema,        // 스키마 정보
} = getTableConfig(table);

객체 타입 비교하기 (instanceof 대안)

Drizzle에서 특정 타입의 객체인지 확인하려면 is() 함수를 사용할 수 있습니다. 이 함수는 Drizzle에서 사용 가능한 모든 타입과 함께 사용할 수 있습니다.

IMPORTANT

항상 instanceof 대신 is()를 사용해야 합니다.

예제 몇 가지

import { Column, is } from 'drizzle-orm';

if (is(value, Column)) {
  // value의 타입이 Column으로 좁혀집니다
}

Mock Driver

이 API는 Drizzle 테스트에서 내부적으로 사용하던 drizzle({} as any) API를 대체하는 것입니다. 이전에는 외부 개발자에게 거의 권장하지 않았지만, 이제는 제대로 된 API를 구축하고 공개하기로 결정했습니다. 모든 drizzle 드라이버는 이제 drizzle.mock()을 제공합니다:

import { drizzle } from "drizzle-orm/node-postgres";

const db = drizzle.mock();

필요한 경우 타입을 위해 스키마를 제공할 수도 있습니다:

import { drizzle } from "drizzle-orm/node-postgres";
import * as schema from "./schema"

const db = drizzle.mock({ schema });