Drizzle λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 기초

SQL λ°μ΄ν„°λ² μ΄μŠ€λŠ” μ €μž₯ν•  μ—”ν‹°ν‹°μ˜ μ—„κ²©ν•œ μŠ€ν‚€λ§ˆλ₯Ό 사전에 μ§€μ •ν•΄μ•Ό ν•˜λ©°, μ΄λŸ¬ν•œ μ—”ν‹°ν‹°μ˜ ν˜•νƒœλ₯Ό λ³€κ²½ν•΄μ•Ό ν•  λ•ŒλŠ” μŠ€ν‚€λ§ˆ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ 톡해 μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ κ΄€λ¦¬ν•˜λŠ” μ—¬λŸ¬ ν”„λ‘œλ•μ…˜ μˆ˜μ€€μ˜ 방법이 μžˆμŠ΅λ‹ˆλ‹€. Drizzle은 λ°μ΄ν„°λ² μ΄μŠ€ μš°μ„  λ˜λŠ” μ½”λ“œλ² μ΄μŠ€ μš°μ„  방식에 관계없이 λͺ¨λ“  방법에 μ™„λ²½ν•˜κ²Œ μ ν•©ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ μš°μ„ μ€ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆκ°€ μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€μΈ κ²½μš°μž…λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 직접 λ˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬλ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό κ΄€λ¦¬ν•œ λ‹€μŒ, λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μ½”λ“œλ² μ΄μŠ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€ μ—”ν‹°ν‹°λ‘œ κ°€μ Έμ˜΅λ‹ˆλ‹€.

μ½”λ“œλ² μ΄μŠ€ μš°μ„ μ€ μ½”λ“œλ² μ΄μŠ€μ˜ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆκ°€ μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€μ΄λ©° 버전 관리 ν•˜μ— μžˆλŠ” κ²½μš°μž…λ‹ˆλ‹€. JavaScript/TypeScript둜 λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μ„ μ–Έν•˜κ³  κ΄€λ¦¬ν•œ λ‹€μŒ, Drizzle을 톡해 직접 λ˜λŠ” μ™ΈλΆ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬλ₯Ό 톡해 ν•΄λ‹Ή μŠ€ν‚€λ§ˆλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€ μžμ²΄μ— μ μš©ν•©λ‹ˆλ‹€.

Drizzle이 μ–΄λ–»κ²Œ λ„μšΈ 수 μžˆλ‚˜μš”?

Drizzleκ³Ό ν•¨κ»˜ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ CLI 앱인 drizzle-kit을 κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€.

drizzle-kit migrate
drizzle-kit generate
drizzle-kit push
drizzle-kit pull

ν˜„μž¬ λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­μ— 따라 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ μ ‘κ·Ό 방식을 선택할 수 μžˆλ„λ‘ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ°μ΄ν„°λ² μ΄μŠ€ μš°μ„ κ³Ό μ½”λ“œλ² μ΄μŠ€ μš°μ„  μ ‘κ·Ό 방식 λͺ¨λ‘μ— μ ν•©ν•˜λ©°, μŠ€ν‚€λ§ˆλ₯Ό ν‘Έμ‹œν•˜κ±°λ‚˜ SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜κ±°λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μŠ€ν‚€λ§ˆλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 혼자 μž‘μ—…ν•˜λ“  νŒ€μœΌλ‘œ μž‘μ—…ν•˜λ“  μ™„λ²½ν•©λ‹ˆλ‹€.



이제 ν”„λ‘œμ νŠΈμ— κ°€μž₯ μ ν•©ν•œ μ˜΅μ…˜μ„ 선택해 λ³΄κ² μŠ΅λ‹ˆλ‹€:

μ˜΅μ…˜ 1

μ™ΈλΆ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 직접 SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό 직접 κ΄€λ¦¬ν•©λ‹ˆλ‹€. Drizzleμ—μ„œλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μŠ€ν‚€λ§ˆμ˜ ν˜„μž¬ μƒνƒœλ₯Ό 가져와 TypeScript μŠ€ν‚€λ§ˆ 파일둜 μ €μž₯ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

μžμ„Ένžˆ 보기

이것은 λ°μ΄ν„°λ² μ΄μŠ€ μš°μ„  μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€λ‘œ μ‚¬μš©ν•˜λ©°, Drizzle은 drizzle-kit pull λͺ…령을 μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό TypeScript둜 κ°€μ Έμ˜¬ 수 있게 ν•΄μ€λ‹ˆλ‹€.

                                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” 
                                  β”‚                        β”‚ <---  CREATE TABLE "users" (
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚                        β”‚        "id" SERIAL PRIMARY KEY,
β”‚ ~ drizzle-kit pull       β”‚      β”‚                        β”‚        "name" TEXT,
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚        DATABASE        β”‚        "email" TEXT UNIQUE
  β”‚                               β”‚                        β”‚       );
  β”” Pull datatabase schema -----> β”‚                        β”‚
  β”Œ Generate Drizzle       <----- β”‚                        β”‚
  β”‚ schema TypeScript file        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  β”‚
  v
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
  email: p.text().unique(),
});
μ˜΅μ…˜ 2

TypeScript μ½”λ“œλ² μ΄μŠ€μ— λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό 두고 μ‹Άκ³ , SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ 닀루고 μ‹Άμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. Drizzle이 λ‚΄ μŠ€ν‚€λ§ˆλ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— 직접 β€œν‘Έμ‹œβ€ν•˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€.

μžμ„Ένžˆ 보기

이것은 μ½”λ“œλ² μ΄μŠ€ μš°μ„  μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. TypeScript Drizzle μŠ€ν‚€λ§ˆλ₯Ό μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€λ‘œ μ‚¬μš©ν•˜λ©°, Drizzle은 drizzle-kit push λͺ…령을 μ‚¬μš©ν•˜μ—¬ μŠ€ν‚€λ§ˆ λ³€κ²½ 사항을 λ°μ΄ν„°λ² μ΄μŠ€μ— ν‘Έμ‹œν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

이것은 λΉ λ₯Έ ν”„λ‘œν† νƒ€μ΄ν•‘μ— κ°€μž₯ μ ν•©ν•œ μ ‘κ·Ό 방식이며, μˆ˜μ‹­ 개의 νŒ€κ³Ό 개인 κ°œλ°œμžλ“€μ΄ ν”„λ‘œλ•μ…˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ£Όμš” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νλ¦„μœΌλ‘œ μ„±κ³΅μ μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 것을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

src/schema.ts
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
  email: p.text().unique(), // <--- added column
});
Add column to `users` table                                                                          
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ + email: text().unique() β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                           
  v                                           
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ ~ drizzle-kit push       β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”” Pull current datatabase schema ---------> β”‚                          β”‚
                                              β”‚                          β”‚
  β”Œ Generate alternations based on diff <---- β”‚         DATABASE         β”‚
  β”‚                                           β”‚                          β”‚
  β”” Apply migrations to the database -------> β”‚                          β”‚
                                       β”‚      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                       β”‚
  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
   ALTER TABLE `users` ADD COLUMN `email` TEXT UNIQUE; 
μ˜΅μ…˜ 3

TypeScript μ½”λ“œλ² μ΄μŠ€μ— λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό 두고 μ‹Άκ³ , Drizzle이 SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€μ— μ μš©ν•˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€.

μžμ„Ένžˆ 보기

이것은 μ½”λ“œλ² μ΄μŠ€ μš°μ„  μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. TypeScript Drizzle μŠ€ν‚€λ§ˆλ₯Ό μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€λ‘œ μ‚¬μš©ν•˜λ©°, Drizzle은 drizzle-kit generate λͺ…λ ΉμœΌλ‘œ μŠ€ν‚€λ§ˆ λ³€κ²½ 사항을 기반으둜 SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜κ³ , drizzle-kit migrate λͺ…λ ΉμœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ μš©ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

src/schema.ts
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
  email: p.text().unique(),
});
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ $ drizzle-kit generate β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                           
  β”” 1. read previous migration folders
    2. find diff between current and previous schema
    3. prompt developer for renames if necessary
  β”Œ 4. generate SQL migration and persist to file
  β”‚    β”Œβ”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  
  β”‚      πŸ“‚ drizzle       
  β”‚      β”” πŸ“‚ 20242409125510_premium_mister_fear
  β”‚        β”œ πŸ“œ snapshot.json
  β”‚        β”” πŸ“œ migration.sql
  v
-- drizzle/20242409125510_premium_mister_fear/migration.sql

CREATE TABLE "users" (
 "id" SERIAL PRIMARY KEY,
 "name" TEXT,
 "email" TEXT UNIQUE
);
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ $ drizzle-kit migrate β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                         
  β”” 1. read migration.sql files in migrations folder        β”‚                          β”‚
    2. fetch migration history from database -------------> β”‚                          β”‚
  β”Œ 3. pick previously unapplied migrations <-------------- β”‚         DATABASE         β”‚
  β”” 4. apply new migration to the database ---------------> β”‚                          β”‚
                                                            β”‚                          β”‚
                                                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
[βœ“] done!                                                 
μ˜΅μ…˜ 4

TypeScript μ½”λ“œλ² μ΄μŠ€μ— λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό 두고 μ‹Άκ³ , Drizzle이 SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜κ³  λŸ°νƒ€μž„μ— μ μš©ν•˜κΈ°λ₯Ό μ›ν•©λ‹ˆλ‹€.

μžμ„Ένžˆ 보기

이것은 μ½”λ“œλ² μ΄μŠ€ μš°μ„  μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. TypeScript Drizzle μŠ€ν‚€λ§ˆλ₯Ό μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€λ‘œ μ‚¬μš©ν•˜λ©°, Drizzle은 drizzle-kit generate λͺ…λ ΉμœΌλ‘œ μŠ€ν‚€λ§ˆ λ³€κ²½ 사항을 기반으둜 SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜κ³ , μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λŸ°νƒ€μž„ λ™μ•ˆ λ°μ΄ν„°λ² μ΄μŠ€μ— μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 μ ‘κ·Ό 방식은 무쀑단 배포 쀑에 λ°μ΄ν„°λ² μ΄μŠ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ μš©ν•˜κ³  λ¬Έμ œκ°€ λ°œμƒν•˜λ©΄ DDL λ³€κ²½ 사항을 λ‘€λ°±ν•˜λŠ” λͺ¨λ†€λ¦¬μ‹ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— 널리 μ‚¬μš©λ©λ‹ˆλ‹€. 배포 ν”„λ‘œμ„ΈμŠ€ 쀑에 μ»€μŠ€ν…€ λ¦¬μ†ŒμŠ€μ—μ„œ ν•œ 번 μ‹€ν–‰λ˜λŠ” λ§ˆμ΄κ·Έλ ˆμ΄μ…˜κ³Ό ν•¨κ»˜ μ„œλ²„λ¦¬μŠ€ λ°°ν¬μ—μ„œλ„ μ‚¬μš©λ©λ‹ˆλ‹€.

src/schema.ts
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
  email: p.text().unique(),
});
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ $ drizzle-kit generate β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                           
  β”” 1. read previous migration folders
    2. find diff between current and previous schema
    3. prompt developer for renames if necessary
  β”Œ 4. generate SQL migration and persist to file
  β”‚    β”Œβ”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  
  β”‚      πŸ“‚ drizzle       
  β”‚      β”” πŸ“‚ 20242409125510_premium_mister_fear
  β”‚        β”œ πŸ“œ snapshot.json
  β”‚        β”” πŸ“œ migration.sql
  v
-- drizzle/20242409125510_premium_mister_fear/migration.sql

CREATE TABLE "users" (
 "id" SERIAL PRIMARY KEY,
 "name" TEXT,
 "email" TEXT UNIQUE
);
// index.ts
import { drizzle } from "drizzle-orm/node-postgres"
import { migrate } from 'drizzle-orm/node-postgres/migrator';

const db = drizzle(process.env.DATABASE_URL);

await migrate(db);
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ npx tsx src/index.ts  β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                                      
  β”œ 1. init database connection                             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                         
  β”” 2. read migration.sql files in migrations folder        β”‚                          β”‚
    3. fetch migration history from database -------------> β”‚                          β”‚
  β”Œ 4. pick previously unapplied migrations <-------------- β”‚         DATABASE         β”‚
  β”” 5. apply new migration to the database ---------------> β”‚                          β”‚
                                                            β”‚                          β”‚
                                                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
[βœ“] done!                                                 
μ˜΅μ…˜ 5

TypeScript μ½”λ“œλ² μ΄μŠ€μ— λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό 두고 μ‹Άκ³ , Drizzle이 SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜κΈ°λ₯Ό μ›ν•˜μ§€λ§Œ, λ°μ΄ν„°λ² μ΄μŠ€μ— 직접 λ˜λŠ” μ™ΈλΆ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬλ₯Ό 톡해 μ μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

μžμ„Ένžˆ 보기

이것은 μ½”λ“œλ² μ΄μŠ€ μš°μ„  μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. TypeScript Drizzle μŠ€ν‚€λ§ˆλ₯Ό μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€λ‘œ μ‚¬μš©ν•˜λ©°, Drizzle은 drizzle-kit generate λͺ…λ ΉμœΌλ‘œ μŠ€ν‚€λ§ˆ λ³€κ²½ 사항을 기반으둜 SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ νŒŒμΌμ„ μƒμ„±ν•˜κ³ , λ°μ΄ν„°λ² μ΄μŠ€μ— 직접 λ˜λŠ” μ™ΈλΆ€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬλ₯Ό 톡해 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

src/schema.ts
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
  email: p.text().unique(),
});
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ $ drizzle-kit generate β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                           
  β”” 1. read previous migration folders
    2. find diff between current and previous scheama
    3. prompt developer for renames if necessary
  β”Œ 4. generate SQL migration and persist to file
  β”‚    β”Œβ”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  
  β”‚      πŸ“‚ drizzle       
  β”‚      β”” πŸ“‚ 20242409125510_premium_mister_fear
  β”‚        β”œ πŸ“œ snapshot.json
  β”‚        β”” πŸ“œ migration.sql
  v
-- drizzle/20242409125510_premium_mister_fear/migration.sql

CREATE TABLE "users" (
 "id" SERIAL PRIMARY KEY,
 "name" TEXT,
 "email" TEXT UNIQUE
);
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ (._.) now you run your migrations β”‚           
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  
  β”‚
 directly to the database
  β”‚                                         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€>β”‚                    β”‚  
  β”‚                                    β”‚    β”‚      Database      β”‚           
 or via external tools                 β”‚    β”‚                    β”‚   
  β”‚                                    β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚      
  └──│ Bytebase           β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  
     β”‚ Liquibase          β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ 
     β”‚ Atlas              β”‚
     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ 
     β”‚ etc…               β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

[βœ“] done!                                                 
μ˜΅μ…˜ 6

TypeScript μ½”λ“œλ² μ΄μŠ€μ— λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆλ₯Ό 두고 μ‹Άκ³ , Drizzle이 Drizzle μŠ€ν‚€λ§ˆμ˜ SQL ν‘œν˜„μ„ μ½˜μ†”μ— 좜λ ₯ν•˜κΈ°λ₯Ό μ›ν•˜λ©°, Atlasλ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— μ μš©ν•˜κ² μŠ΅λ‹ˆλ‹€.

μžμ„Ένžˆ 보기

이것은 μ½”λ“œλ² μ΄μŠ€ μš°μ„  μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€. TypeScript Drizzle μŠ€ν‚€λ§ˆλ₯Ό μ‹ λ’°ν•  수 μžˆλŠ” μ†ŒμŠ€λ‘œ μ‚¬μš©ν•˜λ©°, Drizzle은 drizzle-kit export λͺ…λ ΉμœΌλ‘œ μŠ€ν‚€λ§ˆ λ³€κ²½ 사항을 기반으둜 SQL 문을 내보내고, Atlas λ˜λŠ” 기타 μ™ΈλΆ€ SQL λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 도ꡬλ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

src/schema.ts
import * as p from "drizzle-orm/pg-core";

export const users = p.pgTable("users", {
  id: p.serial().primaryKey(),
  name: p.text(),
  email: p.text().unique(),
});
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ $ drizzle-kit export   β”‚                  
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  
  β”‚                                           
  β”” 1. read your drizzle schema
    2. generated SQL representation of your schema
  β”Œ 3. outputs to console
  β”‚    
  β”‚        
  v
CREATE TABLE "users" (
 "id" SERIAL PRIMARY KEY,
 "name" TEXT,
 "email" TEXT UNIQUE
);
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                  
β”‚ (._.) now you run your migrations β”‚           
β””β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  
  β”‚
 via Atlas
  β”‚                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚              β”‚
  └──│ Atlas              β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€>β”‚  Database    β”‚      
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜            β”‚              β”‚       
                                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

[βœ“] done!