์ฟผ๋ฆฌ ์„ฑ๋Šฅ

Drizzle์— ๊ด€ํ•ด์„œ๋Š” โ€” ์šฐ๋ฆฌ๋Š” SQL ์œ„์— ๊ฑฐ์˜ 0์— ๊ฐ€๊นŒ์šด ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ€์ง„ ์–‡์€ TypeScript ๋ ˆ์ด์–ด์ด๋ฉฐ, ์‹ค์ œ๋กœ 0์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ค€๋น„๋œ ๋ฌธ API๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋“ค์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

์ค€๋น„๋œ ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด Drizzle ORM ์ธก์—์„œ SQL ์—ฐ๊ฒฐ์„ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๋Š” ๋งค๋ฒˆ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๋Œ€์‹  ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ SQL์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๊ทœ๋ชจ SQL ์ฟผ๋ฆฌ์—์„œ ๊ทน๋„์˜ ์„ฑ๋Šฅ ์ด์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ค€๋น„๋œ ๋ฌธ์„ ์ง€์›ํ•˜๋ฉฐ, ๋•Œ๋กœ๋Š” Drizzle ORM์ด better-sqlite3 ๋“œ๋ผ์ด๋ฒ„๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค€๋น„๋œ ๋ฌธ

PostgreSQL
MySQL
SQLite
SingleStore
const db = drizzle(...);

const prepared = db.select().from(customers).prepare("statement_name");

const res1 = await prepared.execute();
const res2 = await prepared.execute();
const res3 = await prepared.execute();

ํ”Œ๋ ˆ์ด์Šคํ™€๋”

๋™์  ๋Ÿฐํƒ€์ž„ ๊ฐ’์„ ํฌํ•จํ•ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค 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 = 10
await p1.execute({ id: 12 }) // SELECT * FROM customers WHERE id = 12

const 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%'