타입 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;
// 또는
type SelectUser = typeof users . _ .$inferSelect;
type InsertUser = typeof users . _ .$inferInsert;
// 또는
type SelectUser = InferSelectModel ;
type InsertUser = InferInsertModel ;
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;
// 또는
type SelectUser = typeof users . _ .$inferSelect;
type InsertUser = typeof users . _ .$inferInsert;
// 또는
type SelectUser = InferSelectModel ;
type InsertUser = InferInsertModel ;
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;
// 또는
type SelectUser = typeof users . _ .$inferSelect;
type InsertUser = typeof users . _ .$inferInsert;
// 또는
type SelectUser = InferSelectModel ;
type InsertUser = InferInsertModel ;
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;
// 또는
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 { 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 쿼리 출력하기
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 쿼리를 실행할 수 있습니다.
const statement = sql `select * from ${ users } where ${ users .id } = ${ userId } ` ;
const res : postgres . RowList []> = 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);
독립 실행형 쿼리 빌더
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 { getTableColumns } from "drizzle-orm" ;
import { user } from "./schema" ;
// user 테이블의 컬럼을 가져옴
const { password , role , ... rest } = getTableColumns (user);
// password와 role을 제외한 나머지 컬럼을 선택
await db .select ({ ... rest }) .from (users);
import { serial , text , pgTable } from "drizzle-orm/pg-core" ;
// user 테이블 스키마 정의
export const user = pgTable ( "user" , {
id : serial ( "id" ) .primaryKey () ,
name : text ( "name" ) ,
email : text ( "email" ) ,
password : text ( "password" ) ,
role : text ( "role" ) .$type () ,
});
import { getTableColumns } from "drizzle-orm" ;
import { user } from "./schema" ;
// user 테이블의 컬럼을 가져옴
const { password , role , ... rest } = getTableColumns (user);
// password와 role을 제외한 나머지 컬럼을 선택
await db .select ({ ... rest }) .from (users);
import { int , text , mysqlTable } from "drizzle-orm/mysql-core" ;
// user 테이블 스키마 정의
export const user = mysqlTable ( "user" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
email : text ( "email" ) ,
password : text ( "password" ) ,
role : text ( "role" ) .$type () ,
});
import { getTableColumns } from "drizzle-orm" ;
import { user } from "./schema" ;
// user 테이블의 컬럼을 가져옴
const { password , role , ... rest } = getTableColumns (user);
// password와 role을 제외한 나머지 컬럼을 선택
await db .select ({ ... rest }) .from (users);
import { integer , text , sqliteView } from "drizzle-orm/sqlite-core" ;
// user 테이블 스키마 정의
export const user = pgTable ( "user" , {
id : integer ( "id" ) .primaryKey ({ autoIncrement : true }) ,
name : text ( "name" ) ,
email : text ( "email" ) ,
password : text ( "password" ) ,
role : text ( "role" ) .$type () ,
});
import { getTableColumns } from "drizzle-orm" ;
import { user } from "./schema" ;
// user 테이블의 컬럼을 가져옴
const { password , role , ... rest } = getTableColumns (user);
// password와 role을 제외한 나머지 컬럼을 선택
await db .select ({ ... rest }) .from (users);
import { int , text , mysqlTable } from "drizzle-orm/singlestore-core" ;
// user 테이블 스키마 정의
export const user = singlestoreTable ( "user" , {
id : int ( "id" ) .primaryKey () .autoincrement () ,
name : text ( "name" ) ,
email : text ( "email" ) ,
password : text ( "password" ) ,
role : text ( "role" ) .$type () ,
});
테이블 정보 가져오기
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 대안)
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 });