Raw ํจ์ ๊ฐ์
Raw ํ์ ํจ์
ํ์
๋ณ Raw ํจ์ rawString, rawNumber
WHERE Raw
๋ณต์กํ ์กฐ๊ฑด๋ฌธ whereRaw
CASE WHEN
์กฐ๊ฑด๋ถ ๊ฐ ์ ํ CASE ํํ์
์๋ธ์ฟผ๋ฆฌ
์ค์ฒฉ ์ฟผ๋ฆฌ ์์ฑ Subquery
Raw ํ์ ํจ์
rawString - ๋ฌธ์์ด ๋ฐํ
rawNumber - ์ซ์ ๋ฐํ
rawBoolean - ๋ถ๋ฆฐ ๋ฐํ
rawDate - ๋ ์ง ๋ฐํ
rawStringArray - ๋ฌธ์์ด ๋ฐฐ์ด ๋ฐํ
ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ
Raw ํจ์๋ Knex ์คํ์ผ์ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ ์ง์ํฉ๋๋ค. SQL ๋ฌธ์์ด ๋ด์ ํ๋ ์ด์คํ๋๋ฅผ ์ฌ์ฉํ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ธ๋ฉ ๊ฐ ๋ฐฐ์ด์ ์ ๋ฌํฉ๋๋ค.ํ๋ ์ด์คํ๋ ๊ท์น
๊ฐ ๋ฐ์ธ๋ฉ (?)
์ฌ์ฉ์ ์
๋ ฅ์ด๋ ๋์ ๊ฐ์ ๋ฐ๋์ ? ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํฉ๋๋ค.
์๋ณ์ ๋ฐ์ธ๋ฉ (??)
ํ
์ด๋ธ๋ช
์ด๋ ์ปฌ๋ผ๋ช
์ ๋์ ์ผ๋ก ์ง์ ํ ๋๋ ?? ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํฉ๋๋ค. table.column ํํ์ ๋ฌธ์์ด์ ์๋์ผ๋ก "table"."column"์ผ๋ก ๋ณํ๋ฉ๋๋ค.
ํผํฉ ์ฌ์ฉ
ํ๋์ ํํ์์์?์ ??๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
Static SQL ํจ์
Puri๊ฐ ์ ๊ณตํ๋ ๋ด์ฅ SQL ํจ์๋ค์ ๋๋ค.๋ฌธ์์ด ํจ์
Puri.concatExpressions()๋ ๋ฐ์ธ๋ฉ๋ ๋ฆฌํฐ๋ด ๋งค๊ฐ๋ณ์์ PostgreSQL text ํ์
์บ์คํธ๋ฅผ
์ถ๊ฐํ๋ฏ๋ก ์ ์์์ฒ๋ผ ๋ฆฌํฐ๋ด๋ง ์ฌ์ฉํ ํํ์๋ ์คํํ ์ ์์ต๋๋ค. ๊ธฐ์กด Puri.concat()์
๋ฆฌํฐ๋ด์ ํ์
์ด ์ง์ ๋์ง ์์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ธ๋ฉํ๋ฉฐ, "users.name" ๊ฐ์ ์ธ์๋ฅผ ์ปฌ๋ผ์ผ๋ก
ํด์ํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฆฌํฐ๋ด๋ง ์ฌ์ฉํ ๋
๋ฆฝ์ ์ธ Puri.concat() ํํ์์ PostgreSQL์์
์คํํ ์ ์์ต๋๋ค. ๋ฌธ์์ด SQL ํํ์๊ณผ ๋ฆฌํฐ๋ด ํ
์คํธ๋ฅผ ์กฐํฉํ๋ ค๋ฉด JSON ํ๋
์ถ์ถ์ Puri.concatExpressions()์ Puri.coalesce()๋ฅผ ์ฌ์ฉํ์ธ์.
์ง๊ณ ํจ์
WHERE Raw
๋ณต์กํ WHERE ์กฐ๊ฑด์ ์ง์ ์์ฑํ ์ ์์ต๋๋ค.๊ธฐ๋ณธ WHERE Raw
๋ณต์กํ ์กฐ๊ฑด
๋ ์ง ํจ์
CASE WHEN - ์กฐ๊ฑด๋ถ ๊ฐ
CASE WHEN ํํ์์ผ๋ก ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค.๊ธฐ๋ณธ CASE WHEN
์ซ์ ๊ณ์ฐ
Boolean ๊ฒฐ๊ณผ
์๋ธ์ฟผ๋ฆฌ์ Raw SQL
Scalar ์๋ธ์ฟผ๋ฆฌ
COALESCE - NULL ์ฒ๋ฆฌ
์ค์ ์์
์ฌ์ฉ์ ํต๊ณ ๋์๋ณด๋
์๊ฐ๋๋ณ ์ง๊ณ
์์ ๊ณ์ฐ
์๋์ฐ ํจ์
ROW_NUMBER
RANK / DENSE_RANK
LAG / LEAD - ์ด์ /๋ค์ ํ
JSON ํจ์ (PostgreSQL)
JSON ํ๋ ์ถ์ถ
jsonText()๋ ์์ฑ๋ JSON ์ปฌ๋ผ๊ณผ ํ๋ ์ด์์ ๊ฒฝ๋ก ์กฐ๊ฐ์ ๋ฐ์ผ๋ฉฐ ์ฟผ๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฌธ์์ด SQL
ํํ์์ ๋ฐํํฉ๋๋ค. ๊ฒฝ๋ก๊ฐ ์๊ฑฐ๋ ํด๋น JSON ๊ฐ์ด null์ด๋ฉด PostgreSQL์ SQL NULL์ ๋ฐํํฉ๋๋ค.
๋ฐ๋ผ์ jsonText()๋ฅผ ์ง์ ์ ํํ๋ฉด string | null๋ก ์ถ๋ก ๋ฉ๋๋ค. Puri.coalesce()๋ก ๊ฐ์ธ๋ฉด ์
summary์ฒ๋ผ null์ด ์๋ string์ผ๋ก ์ถ๋ก ๋ฉ๋๋ค. ๊ฒฝ๋ก ์กฐ๊ฐ๊ณผ ๋ฆฌํฐ๋ด ํ
์คํธ, ๋์ฒด๊ฐ์ ๊ฐ์ผ๋ก
๋ฐ์ธ๋ฉํ๋ฉฐ, Puri.concatExpressions()์๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด๊ณผ ๋ฌธ์์ด SQL ํํ์๋ง ์ ๋ฌํ ์ ์์ต๋๋ค.
JSON ํค ์กด์ฌ ์ฌ๋ถ
whereJsonKeyExists()๋ PostgreSQL JSONB์ ? ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ณ ํค๋ฅผ ๊ฐ์ผ๋ก ๋ฐ์ธ๋ฉํฉ๋๋ค. ์ต์์
ํค๊ฐ ์๋์ง ํ์ธํ๋ฏ๋ก JSON ๊ฐ์ด null์ธ ํค๋ ์กด์ฌํ๋ ๊ฒ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. AND/OR ์ฐ์ ์์๋ฅผ
๋ช
ํํ ์ ์งํ๋ ค๋ฉด ๊ทธ๋ฃน ์์์ whereJsonKeyExists()์ orWhereJsonKeyExists()๋ฅผ ์ฌ์ฉํ์ธ์.
JSON ์ง๊ณ
์ฑ๋ฅ ์ต์ ํ
EXPLAIN ์ฌ์ฉ
์ธ๋ฑ์ค ํํธ (PostgreSQL์ ์ง์ ์ํจ)
PostgreSQL์ ์ตํฐ๋ง์ด์ ๊ฐ ์๋์ผ๋ก ์ธ๋ฑ์ค๋ฅผ ์ ํํฉ๋๋ค. ๋์ ํต๊ณ ์ ๋ฐ์ดํธ:ํ์ ์์ ์ฑ
Raw ํจ์๋ค์ ๋ฐํ ํ์ ์ ๋ช ์ํฉ๋๋ค.Raw ์ฟผ๋ฆฌ์ Hydrate
Raw SQL์ ์ฌ์ฉํ ๋๋ **hydrate()**๋ฅผ ์๋์ผ๋ก ํธ์ถํ๊ฑฐ๋, ํ๋ ๋ค์ด๋ฐ ๊ท์น์ ๋ฐ๋ผ์ผ JOIN๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์กฐํํ ์ ์์ต๋๋ค.Subset vs Raw Puri์ ์ฐจ์ด
Hydrate๊ฐ ํ๋ ์ผ
hydrate()๋ flatํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ค์ฒฉ๋ ๊ฐ์ฒด ๊ตฌ์กฐ๋ก ๋ณํํฉ๋๋ค.
Before hydrate (Flat):
ํ๋ ๋ค์ด๋ฐ ๊ท์น: ์ธ๋๋ฐ(__) ์ฌ์ฉ
JOIN๋ ํ
์ด๋ธ์ ํ๋๋ ํ
์ด๋ธ๋ช
__ํ๋๋ช
ํ์์ผ๋ก ์ ํํด์ผ ํฉ๋๋ค.
์๋ Hydrate vs ์๋ Hydrate
Subset ์ฟผ๋ฆฌ (์๋ Hydrate)
Raw Puri ์ฟผ๋ฆฌ (์๋ Hydrate)
executeSubsetQuery์์์ ์๋ Hydrate
executeSubsetQuery()๋ ๋ด๋ถ์ ์ผ๋ก hydrate๋ฅผ ์๋ ํธ์ถํฉ๋๋ค.
Hydrate ํธ์ถ ์์ ์ ๋ฆฌ
์ค์ ์์ : Raw ์ฟผ๋ฆฌ + Hydrate
๊ถ์ฅ ์ฌํญ: - ๊ฐ๋ฅํ๋ฉด Subset ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ธ์ (hydrate ์๋) - ๋ณต์กํ Raw SQL์ด ํ์ํ
๋๋ง ์๋ hydrate ์ฌ์ฉ - ํ๋ ๋ค์ด๋ฐ ๊ท์น(
__)์ ์ผ๊ด๋๊ฒ ์ ์ฉ๋ค์ ๋จ๊ณ
Type Safety
Puri์ ํ์
์์ ์ฑ ์ดํดํ๊ธฐ
Advanced Patterns
์๋ธ์ฟผ๋ฆฌ์ ํธ๋์ญ์
Aggregations
์ง๊ณ ํจ์ ์ฌ์ฉํ๊ธฐ
Basic Queries
๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ก ๋์๊ฐ๊ธฐ