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>;
๋ก๊น
๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋ก๊น
์ ํ์ฑํํ๋ ค๋ฉด 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() });
๋ฉํฐ ํ๋ก์ ํธ ์คํค๋ง
Table creator 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 { 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 mysqlTable = singlestoreTableCreator((name) => `project1_${name}`);
const users = singlestoreTable('users', {
id: int('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 ์ฟผ๋ฆฌ ์ถ๋ ฅ
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 ์ฟผ๋ฆฌ ์คํ
์คํํด์ผ ํ ๋ณต์กํ ์ฟผ๋ฆฌ๊ฐ ์๊ณ 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);
Standalone query builder
Drizzle ORM์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ์ฟผ๋ฆฌ๋ฅผ ๋น๋ํ๊ณ
์์ฑ๋ SQL์ ๊ฐ์ ธ์ฌ ์ ์๋ standalone query builder๋ฅผ ์ ๊ณตํฉ๋๋ค.
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 { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(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 { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(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 { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(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 { getTableColumns } from "drizzle-orm";
import { user } from "./schema";
const { password, role, ...rest } = getTableColumns(user);
await db.select({ ...rest }).from(users);
import { int, text, mysqlTable } 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 { 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);
๊ฐ์ฒด ํ์
๋น๊ต (instanceof ๋์)
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 ํ
์คํธ์์ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ์ผ๋ฉฐ ์ธ๋ถ ๊ฐ๋ฐ์์๊ฒ๋ ๊ฑฐ์ ๊ถ์ฅํ์ง ์์๋ undefined 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 });