Sequelize 및 MySQL 디버깅 빠른 기술

지난 몇 달 동안 우리는 공교롭게도 AWS Aurora Serverless와 Sequelize과 대량의 합작을 했습니다. 이것은 ORM의 일종으로 귀하의 백엔드 코드와 조회를 매우 쉽게 관리하고 유지할 수 있습니다.
유용한 팁과 팁을 적어두고 공유하고 싶습니다.

속편 옵션


특히 테스트를 디버깅하거나 작성할 때, 모든 요청을 가능한 한 상세하게 하는 것은 매우 유용하다. 관계 맵을 어떻게 처리하고, 자바스크립트 코드와 그 데이터 대상을 MySQL로 전환하는지 알고 싶기 때문이다.
MySQL 조회, 테이블 간의 관련, 서로 다른 필터를 더 잘 이해하는 것도 유용하다.
다음은 유용한 constructor options입니다.
   benchmark: true,
   logging: (...msg) => console.log(msg),
   logQueryParameters: true
기본 옵션은 데이터베이스에 조회하는 시간마다 알려 줍니다.
로깅은 False 또는 함수를 사용하여 실행 중인 질의를 기록/인쇄합니다.단, 만약 console.log을 통과한다면, sequelize에서 동적으로 바뀐 값을 정확하게 볼 수 없습니다.
검색의 매개 변수와 db로 보내는 실제 MySQL 스크립트를 정확하게 보십시오. (그리고 선택한 db IDE, 예를 들어 Dbeaver에 복사하여 붙여넣으면 피드백 순환을 더욱 테스트하고 단축할 수 있습니다.)
logQueryParameters에서 사용할 수 있는 매개변수를 인쇄하고 있습니다.logQueryParameters: true을 모두 로그 기능에 기록합니다.(...msg) => console.log(msg)

스크립트 포맷!


이것은 사실 매우 난처하다.
지루한 로그의 지루한 검색을 이해하려고 할 때, 나는 스크립트를 수동으로 포맷하는 데 상당히 오랜 시간이 걸렸다.그리고 구글에서 다른 선택을 검색했습니다. 물론 mysql formatter online을 찾았습니다.
그리고 그걸 찾자마자...나는 스스로에게 물었다. "헤이...이제 생각났다. Dbeaver에는 틀림없이 이렇게 간단한 것이 존재할 거야."
당연하지!
붙여넣기 스크립트만 복사하고 마우스 오른쪽 단추를 누르고 형식을 선택하십시오.
Doh!

그들을 구별하라!


대량의 조회와 관련 표를 포함하는 대형 프로젝트를 처리할 때, 우리는 최종적으로 재구성하고 최적화했다
시간의 추이에 따라 여러 차례 조회하다.우리는 항상 기준 테스트 스크립트를 작성해서 Sequelize의 다른 설정을 시도합니다. 마지막으로 (위의 상세한 로그 덕분) 비교적 긴 스크립트를 작성해서 차이를 알 수 있습니다.
그것들을 포맷한 후에 그것들을 확산시키는 데 매우 유용하며 내부 연결이나 조건상의 위치를 발견할 수 있다.
Here 간단한 온라인 도구입니다.

실행 계획/프로세스


스크립트를 깊이 있게 이해하는 Execution plan / flow도 흥미롭다. 왜 다른 테이블이나 관련 조건만 추가하면 조회가 느려지는지 이해하는 데 도움이 된다.

연결 테이블


일반적으로 응답에 다중 관계 (m:n) 가 있다면, 테이블의 데이터를 연결할 필요가 없습니다. (특히 메인 테이블의 ID를 제외하고는 다른 정보가 없습니다.)Sequelize에 보내는 것을 피하고 데이터와 해석을 저장할 수 있습니다.through에 빈 include을 추가하면 됩니다.
include: [
 {
  association: 'creatives',
  through: {
            attributes: []
            }
  }
 ]
}

소박했어


Sequelize는 줄마다 모형을 되돌려줍니다. 따라서 Sequelize API를 사용하여 상호작용을 하고, 마운트 지연을 하며, 원시 데이터를 가져오거나, Getter와setter의 데이터를 적용하고, 데이터를 편집하고 업데이트할 수 있습니다.
문제는 최종 대상만 원한다면 호출해야 한다는 것이다.모든 속성의 get () (연결된 데이터 그룹이 있다면, 이 속성에 get () 를 교체해야 합니다. (그것들도 모델입니다)
    const plainObjects =  results.map(v => v.get({plain: true}))
이는 다음과 같습니다.
    const plainObjects = results.map(object => {
        const plainObj = object.get()
        plainObj.nestedObjects = plainObj.nestedObjects.map(nested => nested.get())
        plainObj.someOtherNestedObjects = plainObj.someOtherNestedObjects.map(nested => nested.get())
       // and so on for every possible nested associated table
        return plainObj
    })

추가 팁


고급 필터


나는 우리가 복잡한 필터와 연산자를 어떻게 처리하는지 설명했다
특히 필터를 사용할 때 root level where and association level 의 차이를 검사해 보겠습니다. 이것은 최종 조회에 큰 영향을 미칠 수 있기 때문입니다.

하위 질의


 subQuery: false 
Sequelize는 연결과 연결에 있어서 매우 스마트하지만, 때로는 향상을 주고, 특정한 플러그인/하위 검색을 어떻게 처리하는지 명확하게 알려줄 수도 있습니다.어떤 경우, 그것은 확실히 성능을 향상시킬 수 있다.
검색 옵션의 이 매개 변수는 문서 기록이 전혀 없습니다. 따라서 최종 mysql 스크립트의 차이를 확인하고 기준 테스트를 시도해 보십시오. 이득을 볼 수 있다면.

브로셔/파일 RTFM


Sequelize는 매우 광범위한 문서를 가지고 있는 훌륭한 도구입니다.
그것들만 보지 말고 API reference을 진정으로 깊이 연구하여 조회/데이터베이스 모델에 진정으로 영향을 미치는 모든 부차적인 세부 사항을 찾아라.최종적으로 source code을 깊이 연구하여 발생하고 있는 마법을 진정으로 이해합니다!

좋은 웹페이지 즐겨찾기