μ΄ κΈ°λ₯μ μ¬μ©νλ €λ©΄ drizzle-orm@0.32.0 μ΄μ λ° drizzle-kit@0.23.0 μ΄μμ΄ νμν©λλ€
Generated Columns
SQLμ Generated columnsλ κ°μ ν μ΄λΈ λ΄μ λ€λ₯Έ 컬λΌλ€μ ν¬ν¨νλ ννμμ κΈ°λ°μΌλ‘ κ°μ΄ μλμΌλ‘ κ³μ°λλ 컬λΌμ μμ±ν μ μλ κΈ°λ₯μ λλ€. μ΄λ₯Ό ν΅ν΄ λ°μ΄ν° μΌκ΄μ±μ 보μ₯νκ³ , λ°μ΄ν°λ² μ΄μ€ μ€κ³λ₯Ό λ¨μννλ©°, 쿼리 μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
Generated columnsμλ λ κ°μ§ μ νμ΄ μμ΅λλ€:
-
Virtual (λλ non-persistent) Generated Columns: μ΄λ¬ν 컬λΌμ 쿼리ν λλ§λ€ λμ μΌλ‘ κ³μ°λ©λλ€. λ°μ΄ν°λ² μ΄μ€μ μ μ₯ 곡κ°μ μ°¨μ§νμ§ μμ΅λλ€.
-
Stored (λλ persistent) Generated Columns: μ΄λ¬ν 컬λΌμ νμ΄ μ½μ λκ±°λ μ λ°μ΄νΈλ λ κ³μ°λλ©° κ·Έ κ°μ΄ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ©λλ€. μ΄λ₯Ό ν΅ν΄ μΈλ±μ±μ΄ κ°λ₯νκ³ κ° μΏΌλ¦¬λ§λ€ κ°μ μ¬κ³μ°ν νμκ° μκΈ° λλ¬Έμ 쿼리 μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
Generated columnsλ λ€μκ³Ό κ°μ κ²½μ°μ νΉν μ μ©ν©λλ€:
- κΈ°μ‘΄ 컬λΌμμ μλ‘μ΄ λ°μ΄ν° λμΆ
- μλ μ λ°μ΄νΈλ₯Ό νΌνκΈ° μν κ³μ° μλν
- λ°μ΄ν° λ¬΄κ²°μ± λ° μΌκ΄μ± κ°ν
- 볡μ‘ν κ³μ°μ λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§ λ΄μ μ μ§νμ¬ μ ν리μΌμ΄μ λ‘μ§ λ¨μν
Generated columnsμ ꡬν λ° μ¬μ©λ²μ μλ‘ λ€λ₯Έ SQL λ°μ΄ν°λ² μ΄μ€μμ ν¬κ² λ¬λΌμ§ μ μμ΅λλ€. PostgreSQL, MySQL, SQLiteλ κ°κ° generated columnsμ κ΄λ ¨νμ¬ κ³ μ ν κΈ°λ₯, μλ λ° μ ν μ¬νμ κ°μ§κ³ μμ΅λλ€. μ΄ μΉμ μμλ κ° λ°μ΄ν°λ² μ΄μ€ μμ€ν μμ generated columnsλ₯Ό κ°μ₯ μ νμ©νλ λ°©λ²μ μ΄ν΄νλ λ° λμμ΄ λλλ‘ μ΄λ¬ν μ°¨μ΄μ μ μμΈν μ΄ν΄λ΄ λλ€.
λ°μ΄ν°λ² μ΄μ€ μΈ‘
νμ
: STOREDλ§ μ§μ
μλ λ°©μ
- μ½μ λλ μ λ°μ΄νΈ μ λ€λ₯Έ 컬λΌμ κΈ°λ°μΌλ‘ κ°μ μλμΌλ‘ κ³μ°ν©λλ€.
κΈ°λ₯
- 볡μ‘ν ννμμ 미리 κ³μ°νμ¬ λ°μ΄ν° μ‘μΈμ€λ₯Ό λ¨μνν©λλ€.
- Generated columnsμ λν μΈλ±μ€ μ§μμΌλ‘ 쿼리 μ±λ₯μ ν₯μμν΅λλ€.
μ ν μ¬ν
- κΈ°λ³Έκ°μ μ§μ ν μ μμ΅λλ€.
- ννμμ λ€λ₯Έ generated columnsλ₯Ό μ°Έμ‘°νκ±°λ μλΈμΏΌλ¦¬λ₯Ό ν¬ν¨ν μ μμ΅λλ€.
- Generated column ννμμ μμ νλ €λ©΄ μ€ν€λ§ λ³κ²½μ΄ νμν©λλ€.
- Primary keys, foreign keys λλ unique constraintsμμ μ§μ μ¬μ©ν μ μμ΅λλ€.
μμΈν μ 보λ PostgreSQL λ¬Έμλ₯Ό νμΈνμΈμ.
Drizzle μΈ‘
Drizzleμμλ λͺ¨λ μ»¬λΌ νμ
μ .generatedAlwaysAs() ν¨μλ₯Ό μ§μ νκ³ μ§μλλ sql 쿼리λ₯Ό μΆκ°νμ¬
μ΄ μ»¬λΌ λ°μ΄ν°λ₯Ό μμ±ν μ μμ΅λλ€.
κΈ°λ₯
μ΄ ν¨μλ 3κ°μ§ λ°©λ²μΌλ‘ generated ννμμ λ°μ μ μμ΅λλ€:
string
export const test = pgTable("test", {
generatedName: text("gen_name").generatedAlwaysAs(`hello world!`),
});CREATE TABLE IF NOT EXISTS "test" (
"gen_name" text GENERATED ALWAYS AS (hello world!) STORED
);sql νκ·Έ - Drizzleμ΄ μΌλΆ κ°μ μ΄μ€μΌμ΄ννλλ‘ νλ €λ κ²½μ°
export const test = pgTable("test", {
generatedName: text("gen_name").generatedAlwaysAs(sql`hello "world"!`),
});CREATE TABLE IF NOT EXISTS "test" (
"gen_name" text GENERATED ALWAYS AS (hello "world"!) STORED
);callback - ν
μ΄λΈμ 컬λΌμ μ°Έμ‘°ν΄μΌ νλ κ²½μ°
export const test = pgTable("test", {
name: text("first_name"),
generatedName: text("gen_name").generatedAlwaysAs(
(): SQL => sql`hi, ${test.name}!`
),
});CREATE TABLE IF NOT EXISTS "test" (
"first_name" text,
"gen_name" text GENERATED ALWAYS AS (hi, "test"."first_name"!) STORED
);μμ μ 체 ν μ€νΈ κ²μμ μ¬μ©ν generated columns
import { SQL, sql } from "drizzle-orm";
import { customType, index, integer, pgTable, text } from "drizzle-orm/pg-core";
const tsVector = customType<{ data: string }>({
dataType() {
return "tsvector";
},
});
export const test = pgTable(
"test",
{
id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
content: text("content"),
contentSearch: tsVector("content_search", {
dimensions: 3,
}).generatedAlwaysAs(
(): SQL => sql`to_tsvector('english', ${test.content})`
),
},
(t) => [
index("idx_content_search").using("gin", t.contentSearch)
]
);CREATE TABLE IF NOT EXISTS "test" (
"id" integer PRIMARY KEY GENERATED ALWAYS AS IDENTITY (sequence name "test_id_seq" INCREMENT BY 1 MINVALUE 1 MAXVALUE 2147483647 START WITH 1 CACHE 1),
"content" text,
"content_search" "tsvector" GENERATED ALWAYS AS (to_tsvector('english', "test"."content")) STORED
);
--> statement-breakpoint
CREATE INDEX IF NOT EXISTS "idx_content_search" ON "test" USING gin ("content_search");