Batch API

LibSQL Batch API μ„€λͺ…: 좜처

libSQL ν΄λΌμ΄μ–ΈνŠΈ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ batchλŠ” μ•”μ‹œμ  νŠΈλžœμž­μ…˜μœΌλ‘œ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰λ˜λŠ” ν•˜λ‚˜ μ΄μƒμ˜ SQL λ¬Έμž…λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ€ libSQL λ°±μ—”λ“œμ— μ˜ν•΄ μ œμ–΄λ©λ‹ˆλ‹€. λͺ¨λ“  문이 μ„±κ³΅ν•˜λ©΄ νŠΈλžœμž­μ…˜μ΄ μ»€λ°‹λ©λ‹ˆλ‹€. λ¬Έ 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ 전체 νŠΈλžœμž­μ…˜μ΄ 둀백되고 λ³€κ²½ 사항이 μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

D1 Batch API μ„€λͺ…: 좜처

Batching은 단일 호좜 λ‚΄μ—μ„œ μ—¬λŸ¬ SQL 문을 λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μ „μ†‘ν•©λ‹ˆλ‹€. μ΄λŠ” D1에 λŒ€ν•œ λ„€νŠΈμ›Œν¬ 왕볡 μ§€μ—° μ‹œκ°„μ„ 쀄여 μ„±λŠ₯에 큰 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€. D1은 μžλ™ 컀밋 λͺ¨λ“œλ‘œ μž‘λ™ν•©λ‹ˆλ‹€. 우리의 κ΅¬ν˜„μ€ λͺ©λ‘μ˜ 각 문이 순차적으둜, λΉ„λ™μ‹œμ μœΌλ‘œ μ‹€ν–‰λ˜κ³  컀밋됨을 보μž₯ν•©λ‹ˆλ‹€. 일괄 처리된 문은 SQL νŠΈλžœμž­μ…˜μž…λ‹ˆλ‹€. μ‹œν€€μŠ€μ˜ 문이 μ‹€νŒ¨ν•˜λ©΄ ν•΄λ‹Ή νŠΉμ • 문에 λŒ€ν•œ 였λ₯˜κ°€ λ°˜ν™˜λ˜κ³  전체 μ‹œν€€μŠ€κ°€ μ€‘λ‹¨λ˜κ±°λ‚˜ λ‘€λ°±λ©λ‹ˆλ‹€.

Drizzle ORM은 LibSQL, Neon 및 D1에 λŒ€ν•΄ SQL 문을 일괄 처리둜 μ‹€ν–‰ν•˜λŠ” APIλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

const batchResponse: BatchResponse = await db.batch([
	db.insert(usersTable).values({ id: 1, name: 'John' }).returning({ id: usersTable.id }),
	db.update(usersTable).set({ name: 'Dan' }).where(eq(usersTable.id, 1)),
	db.query.usersTable.findMany({}),
	db.select().from(usersTable).where(eq(usersTable.id, 1)),
	db.select({ id: usersTable.id, invitedBy: usersTable.invitedBy }).from(usersTable),
]);

이 μ˜ˆμ œμ—μ„œ batchResponse의 νƒ€μž…μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

libSQL
Neon
D1
type BatchResponse = [
	{
		id: number;
	}[],
	ResultSet,
	{
		id: number;
		name: string;
		verified: number;
		invitedBy: number | null;
	}[],
	{
		id: number;
		name: string;
		verified: number;
		invitedBy: number | null;
	}[],
	{
		id: number;
		invitedBy: number | null;
	}[],
]

db.batch λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” λͺ¨λ“  κ°€λŠ₯ν•œ λΉŒλ”:

db.all(),
db.get(),
db.values(),
db.run(),
db.execute(),
db.query.<table>.findMany(),
db.query.<table>.findFirst(),
db.select()...,
db.update()...,
db.delete()...,
db.insert()...,