Postgres에서 Typescript 유형 생성

사진작가Uriel SoberanesUnsplash
Postgres 데이터베이스 모델을 추출하고 Typescript 형식을 생성할 수 있는 도구를 만들었습니다.그것 Kanel 이라고 합니다.
ORM이 아닙니다.나는 단지 편집기에 유형을 입력하고 싶을 뿐이다. 이렇게 하면 나는 할 수 있다
  • 필드를 잊어버리거나 존재하지 않는 필드에 접근하려고 하면 오류 메시지를 되돌려줍니다.
  • 이 점을 실현할 수 있는 많은 방법이 있지만, 나는 특정한 요구가 있기 때문에 이런 방법을 채택하기로 결정했다. 나는 나의 데이터베이스 모델이 유일한 진리의 원천이 되기를 바란다.저는 순수한 SQL로 마이그레이션을 작성하고 싶습니다. 거의 순수한 SQL로 조회를 작성합니다 (사용 Knex.js.데이터베이스 드라이브라고 할 수 있는 디자인에 따라 Postgrest라는 프로젝트와 이 블로그를 따라 두 가지 깨우침을 주었다. Simplify: move code into database functions.이런 이념을 바탕으로 나는 전단 코드와 후단 코드에서 생성된 많은 유형을 중용했다.
    데이터베이스에서'반사'데이터를 얻는 것은 매우 간단하기 때문에 어떤 표, 열, 보기가 존재하는지 쉽게 확정할 수 있다.그러나 원시 정보는 일반적으로 모델의 의미를 묘사하기에 부족하다.각종 메모리 데이터를 원합니다.예를 들어 일부 테이블의 열은 암호화 값을 포함하고 있습니다. 이 열을 표시하면 서버의 데이터를 자동으로 복호화하고 검사해서 의외로 전방으로 전송되지 않도록 합니다.
    나는 이런 메타데이터를 포함하는 데이터베이스를 보충하기 위해 어떤 파일을 사용하는 것을 고려하지만, 이것은 두 곳에서 유지보수를 해야 한다는 것을 의미한다.이것은 결코 완전한 정지 문자가 아니다. 왜냐하면 양자의 동기화를 유지하는 것은 매우 간단하지만, 그다지 좋지 않기 때문이다.다행히도, Postgres는 거의 모든 내용에 대해 주석을 작성할 수 있습니다. 표, 열, 과정 등입니다. 저는 이 내용을 사용하여 실제 주석을 작성할 수 있을 뿐만 아니라, 이 주석들은 JSDoc이 제 typescript 형식으로 들어갈 것입니다. 또한 표기 모드가 있는 사용자 정의 메타데이터에 대한 지원을 추가할 수 있습니다.그래서 나는 이런 주석을 처리할 수 있는 아주 작은 해석 단계를 추가했다.
    COMMENT ON TABLE member 
     IS 'Member of the organization @cached @alias:person';
    
    그러면 다음과 같은 메모 및 태그 맵이 생성됩니다.
    comment: 'Member of the organization',
    tags: { cached: true, alias: 'person' }
    
    현재, Kanel 자체는 현재 하나의 태그만 찾습니다:fixed. 이것은 테이블에 초기 값 설정 항목 형식을 만들지 말아야 한다는 것을 나타냅니다.하지만 원하는 모든 메타데이터로 확장할 수 있습니다.
    카넬을 뛰게 하는 건 쉬워요.라는 프로필을 만들어야 합니다.kanelrc.js는 실행 중인 데이터베이스 (일반적으로 로컬 개발자 데이터베이스) 에 접근할 수 있습니다.이것은 최소 구성 파일입니다.
    const path = require('path');
    
    module.exports = {
     connection: {
     host: 'localhost',
     user: 'postgres',
     password: 'postgres',
     database: 'acme',
     },
    
    schemas: [
     {
     name: 'public',
     modelFolder: path.join(\_\_dirname, 'src', 'models'),
     },
     ],
    };
    
    Kanel을 devdependences에 추가한 경우 다음을 실행할 수 있습니다.
    $ npx kanel
    
    .../src/models 폴더에서 모드를 위한 typescript 파일을 생성합니다.그것들은 이렇게 보인다.

    보시다시피, 두 개의 인터페이스를 만들었습니다: Actor와 ActorInitializer. 초기화기에는 기본값이 있는 선택 가능한 필드가 포함되어 있습니다.이외에도 ActorId라는 id 유형을 만들었습니다. 이 유형은 flavoring라는 기교 (브랜드와 유사하지만 다른 것) 를 사용하여 표시 유형을 모의합니다.이것은 한 테이블에 속하는 id를 다른 테이블에 분배하는 실례를 허용하지 않는다는 것을 의미합니다


    Typescript를 사용하고 있다면 다른 유형을 사용한 것처럼 사용할 수 있습니다.Javascript를 사용하는 경우에도 JSDoc 주석을 사용할 수 있습니다.이것:



    /\*\* @type {import('./models/Actor').default} \*/
    const actor = fetchActor();
    

    actor 변수를actor 실례로 표시합니다.만약 사용하는 편집기가 VSCode와 같은 typescript 언어 서버를 지원한다면, 접근할 때 자동으로 조언을 받을 것입니다.tsconfig에서 checkJs를 사용할 수도 있습니다.json 또는 jsconfig.json 파일, 입력 오류가 발생하면 빨간색 곡선을 얻을 수 있습니다


    물론, 현재 이러한 유형을 처리할 수 있는 검색 라이브러리가 필요합니다. 죄송합니다. 본문을 작성할 때, 저는 하위 운동 코드 라이브러리에서 원본을 추출하지 않았습니다.하지만, 나는 이렇게 할 계획이니, 계속 관심을 가져주세요

    좋은 웹페이지 즐겨찾기