Drizzle ORM 세팅

3 minute read
2024-07-29

필요한 코드 세팅

스키마, 인스턴스 그리고 설정 파일이 필요하다.


스키마 선언

src/schema.ts
import { pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
 
export const enTable = pgTable("en", {
  id: uuid("id").defaultRandom().primaryKey(),
  sentence: text("sentence").default(""),
  link: text("link").default(""),
  createdAt: timestamp("created_at").notNull().defaultNow(),
  updatedAt: timestamp("updated_at")
    .notNull()
    .$onUpdate(() => new Date()),
});
 
export type SelectEnTable = typeof enTable.$inferSelect;
export type InsertEnTable = typeof enTable.$inferInsert;


여기서 주의할 사항은 id 를 uuid 로 하는 게 좋을 것 같다. 자동 증가하는 정수로 생성되는 serial 은 에러가 뜬다. 이유는 잘 모르겠다.


image-20240729135110705


db 싱글톤 인스턴스

src/db.ts
import { config } from "dotenv";
import { drizzle } from "drizzle-orm/neon-http";
 
import { neon } from "@neondatabase/serverless";
 
config({ path: ".env" });
 
const sql = neon(process.env.DATABASE_URL!);
export const db = drizzle(sql);


당연히 환경변수를 추가해줘야한다.


DATABASE_URL="postgresql://..."


config

drizzle.config.ts
import { config } from "dotenv";
import { defineConfig } from "drizzle-kit";
 
config({ path: ".env" });
 
export default defineConfig({
  schema: "./src/schema.ts",
  out: "./migrations",
  dialect: "postgresql",
  dbCredentials: {
    url: process.env.DATABASE_URL!,
  },
});


이제 지금까지 작성한 스키마를 기반으로 설정 파일을 작성해준다.


맨처음과 변경될 때마다

npx drizzle-kit generate


위 명령어를 호출하면 아래와 같이 out 에 지정한 디렉토리 하위에 마이그레이션 파일들이 생성된다.


image-20240729135452600


그 다음 migrate 하거나 push (migrate 포함) 을 진행한다.


npx drizzle-kit migrate
 
npx drizzle-kit push


공식문서 에서 더 자세한 사항 확인하자.


간단한 사용법

삽입 시에는 SQL 과 같은 문법으로 메소드 체이닝으로 작성 가능하다.


insert query
async function insert() {
  const newData = {
    sentence:
      "These migrations are stored in the drizzle/migrations directory, as specified in your drizzle.config.ts",
  } satisfies InsertEnTable;
 
  await db.insert(enTable).values(newData);
}


조회 시에도 동일하다.


select query
async function select() {
  const result = await db.select().from(enTable);
  return result;
}


어떤 플랫폼?

위에서는 Neon 서버리스 데이터베이스 서비스를 사용했다. vercel postgres 도 내부적으로 neon 을 이용한다.


npm 사용량도 많다.


image-20240729140032993


region 어디로 해야하나?

가장 가까운 곳이 일반적으로 location latency 가 짧다.


image-20240729140127191


참고한 블로그 를 기준으로는 Singapore 혹은 Sydney 로 선택하는게 가장 적절해보였다.