select, insert, delete์์ WITH ๋ฌธ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํ์ธํ์ธ์
SQL ์ ๋ฐ์ดํธ
await db.update(users)
.set({ name: 'Mr. Dan' })
.where(eq(users.name, 'Dan'));update์ ์ ๋ฌํ๋ ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ์ปฌ๋ผ ์ด๋ฆ๊ณผ ์ผ์นํ๋ ํค๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
๊ฐ์ฒด์์ undefined ๊ฐ์ ๋ฌด์๋ฉ๋๋ค: ์ปฌ๋ผ์ null๋ก ์ค์ ํ๋ ค๋ฉด null์ ์ ๋ฌํ์ธ์.
๋ค์๊ณผ ๊ฐ์ด ์
๋ฐ์ดํธ ๊ฐ์ฒด์ ์ฌ์ฉํ ๊ฐ์ผ๋ก SQL์ ์ ๋ฌํ ์ ์์ต๋๋ค:
await db.update(users)
.set({ updatedAt: sql`NOW()` })
.where(eq(users.name, 'Dan'));์ ํ
์ฟผ๋ฆฌ์ limit ์ ์ ์ถ๊ฐํ๋ ค๋ฉด .limit()์ ์ฌ์ฉํ์ธ์ - ์๋ฅผ ๋ค์ด:
await db.update(usersTable).set({ verified: true }).limit(2);update "users" set "verified" = $1 limit $2;์ ๋ ฌ
์ฟผ๋ฆฌ์ order by ์ ์ ์ถ๊ฐํ์ฌ ์ง์ ๋ ํ๋๋ก ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํ๋ ค๋ฉด .orderBy()๋ฅผ ์ฌ์ฉํ์ธ์:
import { asc, desc } from 'drizzle-orm';
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name);
await db.update(usersTable).set({ verified: true }).orderBy(desc(usersTable.name));
// ์ฌ๋ฌ ํ๋๋ก ์ ๋ ฌ
await db.update(usersTable).set({ verified: true }).orderBy(usersTable.name, usersTable.name2);
await db.update(usersTable).set({ verified: true }).orderBy(asc(usersTable.name), desc(usersTable.name2));update "users" set "verified" = $1 order by "name";
update "users" set "verified" = $1 order by "name" desc;
update "users" set "verified" = $1 order by "name", "name2";
update "users" set "verified" = $1 order by "name" asc, "name2" desc;returning์ ์ฌ์ฉํ ์ ๋ฐ์ดํธ
PostgreSQL๊ณผ SQLite์์ ํ์ ์ ๋ฐ์ดํธํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ๋ฐ์ ์ ์์ต๋๋ค:
const updatedUserId: { updatedId: number }[] = await db.update(users)
.set({ name: 'Mr. Dan' })
.where(eq(users.name, 'Dan'))
.returning({ updatedId: users.id });with update ์
with ์ ์ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๊ณตํต ํ
์ด๋ธ ํํ์(CTE)์ด๋ผ๋ ๋ ์์ ํ์ ์ฟผ๋ฆฌ๋ก ๋ถํ ํ์ฌ ๋จ์ํํ ์ ์์ต๋๋ค:
const averagePrice = db.$with('average_price').as(
db.select({ value: sql`avg(${products.price})`.as('value') }).from(products)
);
const result = await db.with(averagePrice)
.update(products)
.set({
cheap: true
})
.where(lt(products.price, sql`(select * from ${averagePrice})`))
.returning({
id: products.id
});with "average_price" as (select avg("price") as "value" from "products")
update "products" set "cheap" = $1
where "products"."price" < (select * from "average_price")
returning "id"Update โฆ from
SQLite ๋ฌธ์์์ ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ:
UPDATE-FROM ์์ด๋์ด๋ UPDATE ๋ฌธ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค๋ฅธ ํ ์ด๋ธ์ ์ํด ๊ตฌ๋๋ ์ ์๋๋ก ํ๋ SQL์ ํ์ฅ์ ๋๋ค. โ๋์โ ํ ์ด๋ธ์ ์ ๋ฐ์ดํธ๋๋ ํน์ ํ ์ด๋ธ์ ๋๋ค. UPDATE-FROM์ ์ฌ์ฉํ๋ฉด ๋์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ ์กฐ์ธํ์ฌ ์ด๋ค ํ์ ์ ๋ฐ์ดํธํด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ํด๋น ํ์ ์๋ก์ด ๊ฐ์ด ๋ฌด์์ด์ด์ผ ํ๋์ง ๊ณ์ฐํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค
๋ง์ฐฌ๊ฐ์ง๋ก, PostgreSQL ๋ฌธ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํฉ๋๋ค:
WHERE ์กฐ๊ฑด ๋ฐ ์ ๋ฐ์ดํธ ํํ์์ ๋ค๋ฅธ ํ ์ด๋ธ์ ์ปฌ๋ผ์ด ๋ํ๋ ์ ์๋๋ก ํ๋ ํ ์ด๋ธ ํํ์
Drizzle๋ drizzle-orm@0.36.3 ๋ฒ์ ๋ถํฐ ์ด ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค
await db
.update(users)
.set({ cityId: cities.id })
.from(cities)
.where(and(eq(cities.name, 'Seattle'), eq(users.name, 'John')))update "users" set "city_id" = "cities"."id"
from "cities"
where ("cities"."name" = $1 and "users"."name" = $2)
-- params: [ 'Seattle', 'John' ]์กฐ์ธ๋ ํ ์ด๋ธ์ ๋ณ์นญ์ ์ง์ ํ ์๋ ์์ต๋๋ค(PostgreSQL์์๋ ์ ๋ฐ์ดํธํ ํ ์ด๋ธ์๋ ๋ณ์นญ์ ์ง์ ํ ์ ์์ต๋๋ค).
const c = alias(cities, 'c');
await db
.update(users)
.set({ cityId: c.id })
.from(c);update "users" set "city_id" = "c"."id"
from "cities" "c"PostgreSQL์์๋ ์กฐ์ธ๋ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ ๋ฐํํ ์ ์์ต๋๋ค.
const updatedUsers = await db
.update(users)
.set({ cityId: cities.id })
.from(cities)
.returning({ id: users.id, cityName: cities.name });update "users" set "city_id" = "cities"."id"
from "cities"
returning "users"."id", "cities"."name"