๋์ ์ฟผ๋ฆฌ ๋น๋ฉ
๊ธฐ๋ณธ์ ์ผ๋ก Drizzle์ ๋ชจ๋ ์ฟผ๋ฆฌ ๋น๋๋ ๊ฐ๋ฅํ ํ SQL์ ์ค์ํ๋ ค๊ณ ํ๋ฏ๋ก ๋๋ถ๋ถ์ ๋ฉ์๋๋ฅผ ํ ๋ฒ๋ง ํธ์ถํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, SELECT ๋ฌธ์๋ WHERE ์ ์ด ํ๋๋ง ์์ ์ ์์ผ๋ฏ๋ก .where()๋ฅผ ํ ๋ฒ๋ง ํธ์ถํ ์ ์์ต๋๋ค:
const query = db
.select()
.from(users)
.where(eq(users.id, 1))
.where(eq(users.name, 'John')); // โ ํ์
์ค๋ฅ - where()๋ ํ ๋ฒ๋ง ํธ์ถ ๊ฐ๋ฅ
์ด๋ฌํ ์ ํ์ด ๊ตฌํ๋์ง ์์๋ ์ด์ ORM ๋ฒ์ ์์๋ ์ด ์์ ๊ฐ ํนํ ๋ง์ ์ฌ์ฉ์์๊ฒ ํผ๋์ ์์ธ์ด์์ต๋๋ค. ์ฌ์ฉ์๋ค์ ์ฟผ๋ฆฌ ๋น๋๊ฐ ์ฌ๋ฌ .where() ํธ์ถ์ ๋จ์ผ ์กฐ๊ฑด์ผ๋ก โ๋ณํฉโํ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด ๋์์ ์ ์ฒด ์ฟผ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์์ฑํ๋ ๊ธฐ์กด์ ์ฟผ๋ฆฌ ๋น๋ฉ์ ์ ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฟผ๋ฆฌ ๋น๋๋ฅผ ๋ฐ์์ ํฅ์์ํค๋ ๊ณต์ ํจ์๊ฐ ์๋ ๊ฒฝ์ฐ์ฒ๋ผ ๋์ ์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋น๋ํ๋ ค๊ณ ํ ๋ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Drizzle์ ์ฟผ๋ฆฌ ๋น๋๋ฅผ ์ํ ํน๋ณํ โdynamicโ ๋ชจ๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ ๋ฉ์๋๋ฅผ ํ ๋ฒ๋ง ํธ์ถํ๋ ์ ํ์ ์ ๊ฑฐํฉ๋๋ค.
์ด๋ฅผ ํ์ฑํํ๋ ค๋ฉด ์ฟผ๋ฆฌ ๋น๋์์ .$dynamic()์ ํธ์ถํด์ผ ํฉ๋๋ค.
์ ๊ณต๋ ํ์ด์ง ๋ฒํธ์ ์ ํ์ ํ์ด์ง ํฌ๊ธฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฟผ๋ฆฌ์ LIMIT ๋ฐ OFFSET ์ ์ ์ถ๊ฐํ๋ ๊ฐ๋จํ withPagination ํจ์๋ฅผ ๊ตฌํํ์ฌ ์๋ ๋ฐฉ์์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
function withPagination<T extends PgSelect>(
qb: T,
page: number = 1,
pageSize: number = 10,
) {
return qb.limit(pageSize).offset((page - 1) * pageSize);
}
const query = db.select().from(users).where(eq(users.id, 1));
withPagination(query, 1); // โ ํ์
์ค๋ฅ - ์ฟผ๋ฆฌ ๋น๋๊ฐ ๋์ ๋ชจ๋๊ฐ ์๋
const dynamicQuery = query.$dynamic();
withPagination(dynamicQuery, 1); // โ
OK
withPagination ํจ์๋ ์ ๋ค๋ฆญ์ด๋ฏ๋ก ์๋ฅผ ๋ค์ด ์กฐ์ธ์ ์ถ๊ฐํ์ฌ ์ฟผ๋ฆฌ ๋น๋์ ๊ฒฐ๊ณผ ํ์
์ ์์ ํ ์ ์์ต๋๋ค:
function withFriends<T extends PgSelect>(qb: T) {
return qb.leftJoin(friends, eq(friends.userId, users.id));
}
let query = db.select().from(users).where(eq(users.id, 1)).$dynamic();
query = withFriends(query);
์ด๋ PgSelect ๋ฐ ๊ธฐํ ์ ์ฌํ ํ์
์ด ๋์ ์ฟผ๋ฆฌ ๋น๋ฉ์์ ์ฌ์ฉํ๋๋ก ํน๋ณํ ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ค์ ๋์ ๋ชจ๋์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋์ ์ฟผ๋ฆฌ ๋น๋ฉ์์ ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ํ์
๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
| Dialect | Type |
| Query | Select | Insert | Update | Delete |
| Postgres | PgSelect | PgInsert | PgUpdate | PgDelete |
PgSelectQueryBuilder |
| MySQL | MySqlSelect | MySqlInsert | MySqlUpdate | MySqlDelete |
MySqlSelectQueryBuilder |
| SQLite | SQLiteSelect | SQLiteInsert | SQLiteUpdate | SQLiteDelete |
SQLiteSelectQueryBuilder |
...QueryBuilder ํ์
์ ๋
๋ฆฝํ ์ฟผ๋ฆฌ ๋น๋
์ธ์คํด์ค์ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. DB ์ฟผ๋ฆฌ ๋น๋๋
์ด๋ค์ ํ์ ํด๋์ค์ด๋ฏ๋ก ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
import { QueryBuilder } from 'drizzle-orm/pg-core';
function withFriends<T extends PgSelectQueryBuilder>(qb: T) {
return qb.leftJoin(friends, eq(friends.userId, users.id));
}
const qb = new QueryBuilder();
let query = qb.select().from(users).where(eq(users.id, 1)).$dynamic();
query = withFriends(query);