generate
migrate
push
pull
export
check
up
studio
Drizzle은 쿼리에서 컬럼을 포함하거나 제외할 수 있는 유연한 API를 제공합니다. 모든 컬럼을 포함하려면 다음과 같이 .select() 메서드를 사용할 수 있습니다.
.select()
import { posts } from './schema'; const db = drizzle(...); await db.select().from(posts);
// 결과 타입 type Result = { id: number; title: string; content: string; views: number; }[];
import { integer, pgTable, serial, text } from 'drizzle-orm/pg-core'; export const posts = pgTable('posts', { id: serial('id').primaryKey(), title: text('title').notNull(), content: text('content').notNull(), views: integer('views').notNull().default(0), });
특정 컬럼만 포함하려면 다음과 같이 .select() 메서드를 사용합니다.
await db.select({ title: posts.title }).from(posts);
// 결과 타입 type Result = { title: string; }[];
모든 컬럼과 추가 컬럼을 포함하려면 getTableColumns() 유틸리티 함수를 사용합니다.
getTableColumns()
import { getTableColumns, sql } from 'drizzle-orm'; await db .select({ ...getTableColumns(posts), titleLength: sql`length(${posts.title})`, }) .from(posts);
// 결과 타입 type Result = { id: number; title: string; content: string; views: number; titleLength: number; }[];
컬럼을 제외하려면 getTableColumns() 유틸리티 함수를 사용합니다.
import { getTableColumns } from 'drizzle-orm'; const { content, ...rest } = getTableColumns(posts); // "content" 컬럼 제외 await db.select({ ...rest }).from(posts); // 나머지 컬럼 선택
// 결과 타입 type Result = { id: number; title: string; views: number; }[];
조인과 함께 컬럼을 포함하거나 제외하는 방법은 다음과 같습니다.
import { eq, getTableColumns } from 'drizzle-orm'; import { comments, posts, users } from './db/schema'; // "comments"에서 "userId"와 "postId" 컬럼 제외 const { userId, postId, ...rest } = getTableColumns(comments); await db .select({ postId: posts.id, // "posts"에서 "id" 컬럼 포함 comment: { ...rest }, // 나머지 컬럼 포함 user: users, // getTableColumns(users)와 동일 }) .from(posts) .leftJoin(comments, eq(posts.id, comments.postId)) .leftJoin(users, eq(users.id, posts.userId));
// 결과 타입 type Result = { postId: number; comment: { id: number; content: string; createdAt: Date; } | null; user: { id: number; name: string; email: string; } | null; }[];
import { integer, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core'; export const users = pgTable('users', { id: serial('id').primaryKey(), name: text('name').notNull(), email: text('email').notNull(), }); export const posts = pgTable('posts', { id: serial('id').primaryKey(), title: text('title').notNull(), content: text('content').notNull(), views: integer('views').notNull().default(0), userId: integer('user_id').notNull().references(() => users.id), }); export const comments = pgTable('comments', { id: serial('id').primaryKey(), postId: integer('post_id').notNull().references(() => posts.id), userId: integer('user_id').notNull().references(() => users.id), content: text('content').notNull(), createdAt: timestamp('created_at').notNull().defaultNow(), });
Drizzle은 관계형 쿼리 API를 제공하여 쿼리에서 컬럼을 쉽게 포함하거나 제외할 수 있습니다. 모든 컬럼을 포함하는 방법은 다음과 같습니다.
import * as schema from './schema'; const db = drizzle(..., { schema }); await db.query.posts.findMany();
// 결과 타입 type Result = { id: number; title: string; content: string; views: number; }[]
관계형 쿼리를 사용하여 특정 컬럼만 포함하는 방법은 다음과 같습니다.
await db.query.posts.findMany({ columns: { title: true, }, });
// 결과 타입 type Result = { title: string; }[]
관계형 쿼리를 사용하여 모든 컬럼과 추가 컬럼을 포함하는 방법은 다음과 같습니다.
import { sql } from 'drizzle-orm'; await db.query.posts.findMany({ extras: { titleLength: sql`length(${posts.title})`.as('title_length'), }, });
관계형 쿼리를 사용하여 컬럼을 제외하는 방법은 다음과 같습니다.
await db.query.posts.findMany({ columns: { content: false, }, });
// 결과 타입 type Result = { id: number; title: string; views: number; }[]
관계형 쿼리를 사용하여 관계와 함께 컬럼을 포함하거나 제외하는 방법은 다음과 같습니다.
import * as schema from './schema'; const db = drizzle(..., { schema }); await db.query.posts.findMany({ columns: { id: true, // "id" 컬럼 포함 }, with: { comments: { columns: { userId: false, // "userId" 컬럼 제외 postId: false, // "postId" 컬럼 제외 }, }, user: true, // "users" 테이블의 모든 컬럼 포함 }, });
// 결과 타입 type Result = { id: number; user: { id: number; name: string; email: string; }; comments: { id: number; content: string; createdAt: Date; }[]; }[]
import { relations } from 'drizzle-orm'; import { integer, pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core'; export const users = pgTable('users', { id: serial('id').primaryKey(), name: text('name').notNull(), email: text('email').notNull(), }); export const posts = pgTable('posts', { id: serial('id').primaryKey(), title: text('title').notNull(), content: text('content').notNull(), views: integer('views').notNull().default(0), userId: integer('user_id').notNull().references(() => users.id), }); export const comments = pgTable('comments', { id: serial('id').primaryKey(), postId: integer('post_id').notNull().references(() => posts.id), userId: integer('user_id').notNull().references(() => users.id), content: text('content').notNull(), createdAt: timestamp('created_at').notNull().defaultNow(), }); export const usersRelations = relations(users, ({ many }) => ({ posts: many(posts), comments: many(comments), })); export const postsRelations = relations(posts, ({ many, one }) => ({ comments: many(comments), user: one(users, { fields: [posts.userId], references: [users.id] }), })); export const commentsRelations = relations(comments, ({ one }) => ({ post: one(posts, { fields: [comments.postId], references: [posts.id] }), user: one(users, { fields: [comments.userId], references: [users.id] }), }));
조건부 선택을 위한 커스텀 솔루션을 만드는 방법은 다음과 같습니다.
import { posts } from './schema'; const searchPosts = async (withTitle = false) => { await db .select({ id: posts.id, ...(withTitle && { title: posts.title }), }) .from(posts); }; await searchPosts(); await searchPosts(true);
// 결과 타입 type Result = { id: number; title?: string | undefined; }[];