title: “유용한 기능들”
description: “Drizzle ORM의 유용한 유틸리티 기능과 헬퍼 함수들을 살펴봅니다”
slug: “goodies”
Type API
테이블 스키마에서 select와 insert 쿼리를 위한 타입을 가져오려면 타입 헬퍼를 사용할 수 있습니다.
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;
// or
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// or
type SelectUser = InferSelectModel<typeof users>;
type InsertUser = InferInsertModel<typeof users>;
import { int, text, mysqlTable } from 'drizzle-orm/mysql-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = mysqlTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;
// or
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// or
type SelectUser = InferSelectModel<typeof users>;
type InsertUser = InferInsertModel<typeof users>;
import { int, text, sqliteTable } from 'drizzle-orm/sqlite-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = sqliteTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;
// or
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// or
type SelectUser = InferSelectModel<typeof users>;
type InsertUser = InferInsertModel<typeof users>;
import { int, text, singlestoreTable } from 'drizzle-orm/singlestore-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = singlestoreTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;
// or
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// or
type SelectUser = InferSelectModel<typeof users>;
type InsertUser = InferInsertModel<typeof users>;
import { int, text, mssqlTable } from 'drizzle-orm/mssql-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = mssqlTable('users', {
id: int().primaryKey(),
name: text().notNull(),
});
type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;
// or
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// or
type SelectUser = InferSelectModel<typeof users>;
type InsertUser = InferInsertModel<typeof users>;
import { int4, text, cockroachTable } from 'drizzle-orm/cockroach-core';
import { type InferSelectModel, type InferInsertModel } from 'drizzle-orm'
const users = cockroachTable('users', {
id: int4().primaryKey(),
name: text().notNull(),
});
type SelectUser = typeof users.$inferSelect;
type InsertUser = typeof users.$inferInsert;
// or
type SelectUser = typeof users._.$inferSelect;
type InsertUser = typeof users._.$inferInsert;
// or
type SelectUser = InferSelectModel<typeof users>;
type InsertUser = InferInsertModel<typeof users>;
Logging
기본 쿼리 로깅을 활성화하려면 drizzle 초기화 함수에 { logger: true }를 전달하면 됩니다:
import { drizzle } from 'drizzle-orm/...'; // driver specific
const db = drizzle({ logger: true });
로그 대상을 변경하려면 DefaultLogger 인스턴스를 생성하고 커스텀 writer를 제공하면 됩니다:
import { DefaultLogger, LogWriter } from 'drizzle-orm/logger';
import { drizzle } from 'drizzle-orm/...'; // driver specific
class MyLogWriter implements LogWriter {
write(message: string) {
// Write to file, stdout, etc.
}
}
const logger = new DefaultLogger({ writer: new MyLogWriter() });
const db = drizzle({ logger });
커스텀 로거를 직접 만들 수도 있습니다:
import { Logger } from 'drizzle-orm/logger';
import { drizzle } from 'drizzle-orm/...'; // driver specific
class MyLogger implements Logger {
logQuery(query: string, params: unknown[]): void {
console.log({ query, params });
}
}
const db = drizzle({ logger: new MyLogger() });
Multi-project schema
Table creator API를 사용하면 테이블 이름을 커스터마이징할 수 있습니다.
하나의 데이터베이스에서 여러 프로젝트의 스키마를 관리해야 할 때 유용합니다.
PostgreSQL
MySQL
SQLite
SingleStore
MSSQL
CockroachDB
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 { int, text, mysqlTableCreator } from 'drizzle-orm/mysql-core';
const mysqlTable = mysqlTableCreator((name) => `project1_${name}`);
const users = mysqlTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
import { int, text, sqliteTableCreator } from 'drizzle-orm/sqlite-core';
const sqliteTable = sqliteTableCreator((name) => `project1_${name}`);
const users = sqliteTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
import { int, text, singlestoreTableCreator } from 'drizzle-orm/singlestore-core';
const singlestoreTable = singlestoreTableCreator((name) => `project1_${name}`);
const users = singlestoreTable('users', {
id: int('id').primaryKey(),
name: text('name').notNull(),
});
import { int, text, mssqlTableCreator } from 'drizzle-orm/mssql-core';
const mssqlTable = mssqlTableCreator((name) => `project1_${name}`);
const users = mssqlTable('users', {
id: int().primaryKey(),
name: text().notNull(),
});
import { int4, text, cockroachTableCreator } from 'drizzle-orm/cockroach-core';
const pgTable = cockroachTableCreator((name) => `project1_${name}`);
const users = pgTable('users', {
id: int4().primaryKey(),
name: text().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_*"]
Printing SQL query
db 인스턴스 또는 **standalone query builder**를 사용하여 SQL 쿼리를 출력할 수 있습니다.
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 queries execution
실행해야 할 복잡한 쿼리가 있는데 drizzle-orm이 아직 지원하지 않는 경우,
db.execute 메서드를 사용하여 raw parametrized 쿼리를 실행할 수 있습니다.
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: postgres.RowList<Record<string, unknown>[]> = await db.execute(statement)
import { ..., MySqlQueryResult } from "drizzle-orm/mysql2";
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: MySqlRawQueryResult = await db.execute(statement);
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: unknown[] = db.all(statement)
const res: unknown = db.get(statement)
const res: unknown[][] = db.values(statement)
const res: Database.RunResult = db.run(statement)
import { ..., SingleStoreQueryResult } from "drizzle-orm/singlestore";
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res: SingleStoreRawQueryResult = await db.execute(statement);
import { sql } from "drizzle-orm";
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res = await db.execute(statement);
const statement = sql`select * from ${users} where ${users.id} = ${userId}`;
const res = await db.execute(statement)
Standalone query builder
Drizzle ORM은 데이터베이스 인스턴스를 생성하지 않고도 쿼리를 구성하고
생성된 SQL을 가져올 수 있는 독립 실행형 쿼리 빌더를 제공합니다.
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();
import { QueryBuilder } from 'drizzle-orm/mysql-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
import { QueryBuilder } from 'drizzle-orm/sqlite-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
import { QueryBuilder } from 'drizzle-orm/singlestore-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
import { QueryBuilder } from 'drizzle-orm/mssql-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
import { QueryBuilder } from 'drizzle-orm/cockroach-core';
const qb = new QueryBuilder();
const query = qb.select().from(users).where(eq(users.name, 'Dan'));
const { sql, params } = query.toSQL();
Get typed columns
타입이 지정된 컬럼 맵을 가져올 수 있습니다.
조회 시 특정 컬럼을 제외해야 할 때 유용합니다.
IMPORTANT
getColumns는 drizzle-orm@1.0.0-beta.2부터 사용 가능합니다 (자세한 내용은 여기 참조)
pre-1 버전(예: 0.45.1)을 사용 중이라면 getTableColumns를 사용하세요
import { getColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getColumns(user);
await db.select({ ...rest }).from(users);
import { serial, text, pgTable } from "drizzle-orm/pg-core";
export const user = pgTable("user", {
id: serial("id").primaryKey(),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
import { getColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getColumns(user);
await db.select({ ...rest }).from(users);
import { int, text, mysqlTable } from "drizzle-orm/mysql-core";
export const user = mysqlTable("user", {
id: int("id").primaryKey().autoincrement(),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
import { getColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getColumns(user);
await db.select({ ...rest }).from(users);
import { integer, text, sqliteTable } from "drizzle-orm/sqlite-core";
export const user = sqliteTable("user", {
id: integer("id").primaryKey({ autoIncrement: true }),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
import { getColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getColumns(user);
await db.select({ ...rest }).from(users);
import { int, text, singlestoreTable } from "drizzle-orm/singlestore-core";
export const user = singlestoreTable("user", {
id: int("id").primaryKey().autoincrement(),
name: text("name"),
email: text("email"),
password: text("password"),
role: text("role").$type<"admin" | "customer">(),
});
import { getColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getColumns(user);
await db.select({ ...rest }).from(users);
import { int, text, mssqlTable } from "drizzle-orm/mssql-core";
export const user = mssqlTable("user", {
id: int().primaryKey(),
name: text(),
email: text(),
password: text(),
role: text().$type<"admin" | "customer">(),
});
import { getColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getColumns(user);
await db.select({ ...rest }).from(users);
import { int4, text, pgTable } from "drizzle-orm/cockroach-core";
export const user = pgTable("user", {
id: int4().primaryKey(),
name: text(),
email: text(),
password: text(),
role: text().$type<"admin" | "customer">(),
});
import { getTableConfig, pgTable } from 'drizzle-orm/pg-core';
export const table = pgTable(...);
const {
columns,
indexes,
foreignKeys,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, mysqlTable } from 'drizzle-orm/mysql-core';
export const table = mysqlTable(...);
const {
columns,
indexes,
foreignKeys,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, sqliteTable } from 'drizzle-orm/sqlite-core';
export const table = sqliteTable(...);
const {
columns,
indexes,
foreignKeys,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, mysqlTable } from 'drizzle-orm/singlestore-core';
export const table = singlestoreTable(...);
const {
columns,
indexes,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, mssqlTable } from 'drizzle-orm/mssql-core';
export const table = mssqlTable(...);
const {
columns,
indexes,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
import { getTableConfig, cockroachTable } from 'drizzle-orm/cockroach-core';
export const table = cockroachTable(...);
const {
columns,
indexes,
foreignKeys,
checks,
primaryKeys,
name,
schema,
} = getTableConfig(table);
Compare objects types (instanceof alternative)
is() 함수를 사용하여 객체가 특정 Drizzle 타입인지 확인할 수 있습니다.
Drizzle에서 사용 가능한 모든 타입과 함께 사용할 수 있습니다.
IMPORTANT
instanceof 대신 항상 is()를 사용해야 합니다
몇 가지 예제
import { Column, is } from 'drizzle-orm';
if (is(value, Column)) {
// value's type is narrowed to Column
}
Mock Driver
이 API는 Drizzle 테스트에서 내부적으로 사용했던 drizzle({} as any) API의 후속 버전이며, 외부 개발자에게는 권장되지 않았습니다.
적절한 API를 구축하여 공개하였으며, 이제 모든 drizzle 드라이버는 drizzle.mock()을 지원합니다:
import { drizzle } from "drizzle-orm/...";
const db = drizzle.mock();
타입이 필요한 경우 스키마를 제공할 수 있습니다
import { drizzle } from "drizzle-orm/...";
import * as schema from "./schema"
const db = drizzle.mock({ schema });