Drizzle는 SQL 위에 얇은 TypeScript 레이어를 제공하며, 거의 0에 가까운 오버헤드를 가지고 있습니다. 이를 실제로 0으로 만들기 위해, 여러분은 우리의 prepared statements API를 활용할 수 있습니다.
데이터베이스에서 쿼리를 실행할 때 다음과 같은 일들이 발생합니다:
쿼리 빌더의 모든 설정이 SQL 문자열로 연결됩니다.
해당 문자열과 파라미터가 데이터베이스 드라이버로 전송됩니다.
드라이버는 SQL 쿼리를 바이너리 SQL 실행 가능 형식으로 컴파일하고 데이터베이스로 보냅니다.
prepared statements를 사용하면, Drizzle ORM 측에서 SQL 연결을 한 번만 수행하고, 이후 데이터베이스 드라이버가 매번 쿼리를 파싱하는 대신 미리 컴파일된 바이너리 SQL을 재사용할 수 있습니다. 이는 특히 큰 SQL 쿼리에서 극적인 성능 향상을 가져옵니다.
동적인 런타임 값을 삽입해야 할 때는 sql.placeholder(...) API를 사용할 수 있습니다.
PostgreSQL
MySQL
SQLite
SingleStore
import { sql } from "drizzle-orm";const p1 = db .select() .from(customers) .where(eq(customers.id, sql.placeholder('id'))) .prepare("p1")await p1.execute({ id: 10 }) // SELECT * FROM customers WHERE id = 10await p1.execute({ id: 12 }) // SELECT * FROM customers WHERE id = 12const p2 = db .select() .from(customers) .where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`) .prepare("p2");await p2.execute({ name: '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'
import { sql } from "drizzle-orm";const p1 = db .select() .from(customers) .where(eq(customers.id, sql.placeholder('id'))) .prepare()await p1.execute({ id: 10 }) // SELECT * FROM customers WHERE id = 10await p1.execute({ id: 12 }) // SELECT * FROM customers WHERE id = 12const p2 = db .select() .from(customers) .where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`) .prepare();await p2.execute({ name: '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'
import { sql } from "drizzle-orm";const p1 = db .select() .from(customers) .where(eq(customers.id, sql.placeholder('id'))) .prepare()p1.get({ id: 10 }) // SELECT * FROM customers WHERE id = 10p1.get({ id: 12 }) // SELECT * FROM customers WHERE id = 12const p2 = db .select() .from(customers) .where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`) .prepare();p2.all({ name: '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'
import { sql } from "drizzle-orm";const p1 = db .select() .from(customers) .where(eq(customers.id, sql.placeholder('id'))) .prepare()await p1.execute({ id: 10 }) // SELECT * FROM customers WHERE id = 10await p1.execute({ id: 12 }) // SELECT * FROM customers WHERE id = 12const p2 = db .select() .from(customers) .where(sql`lower(${customers.name}) like ${sql.placeholder('name')}`) .prepare();await p2.execute({ name: '%an%' }) // SELECT * FROM customers WHERE name ilike '%an%'