PostgreSQL에서 TypeScript 정의 생성

저는 GraphQL API 백엔드를 구현할 때 꽤 오랫동안 Knex.js 데이터베이스 클라이언트를 즐겨 사용했습니다. 현재 운이 좋은 한 가지는 실제 데이터베이스 스키마에서 강력한 형식(TypeScript) 모델을 생성하는 기능입니다.

운 좋게도 solution이 있습니다! 다음과 같은 데이터베이스 테이블이 있다고 가정합니다(Knex 마이그레이션).

await db.raw(`
  CREATE DOMAIN short_id
    AS text CHECK(VALUE ~ '^[0-9a-z]{6}$')`);
await db.raw(`
  CREATE TYPE user_role
    AS ENUM ('consumer', 'provider')`);

await db.schema.createTable("user", (table) => {
  table.specificType("id", "short_id").notNullable().primary();
  table.specificType("email", "citext").unique();
  table.text("name").notNullable();
  table.jsonb("credentials").notNullable().defaultTo("{}");
  table.specificType("role", "user_role").notNullable();
  table.timestamps(false, true);
});

User (class) 및 UserRole (enum) 데이터 모델이 있으면 TypeScript와 함께 Knex.js를 최대한 활용할 수 있습니다.

import db, { User, UserRole } from "./db";

const [user] = await db
  .table<User>("user")
  .insert({ id: "1", name: "John", role: UserRole.Provider })
  .onConflict()
  .merge()
  .returning("*");


이 특정 데이터베이스 스키마에 대한 TypeScript 정의는 다음과 같습니다.

export enum UserRole {
  Consumer = "consumer",
  Provider = "provider",
}

export type User = {
  id: string;
  email: string | null;
  name: string;
  credentials: Record<string, unknown>;
  role: UserRole;
  created_at: Date;
  updated_at: Date;
}


이제 흥미로운 부분은 이러한 유형을 자동으로 생성하는 방법입니다. 트릭을 수행할 스크립트는 다음과 같습니다.

const { knex } = require("knex");
const { updateTypes } = require("knex-types");
const db = knex(require("./knexfile"));

updateTypes(db, { output: "./types.ts" }).catch(err => {
  console.error(err);
  process.exit(1);
});


데이터베이스 마이그레이션 워크플로의 일부로 실행합니다. yarn db:migratepackage.json 스크립트에 추가하여 :

{
  "dependencies": {
    "knex": "^0.95.4",
    "pg": "^8.6.0"
  },
  "devDependencies": {
    "knex-types": "^0.1.3"
  },
  "scripts": {
    "db:migrate": "knex migrate:latest && node ./update-types"
  }
}


완전한 사용 예가 포함된 kriasoft/node-starter-kit을 확인하십시오.

즐거운 코딩!

좋은 웹페이지 즐겨찾기