기존 Sequelize 시드 파일 추적

8685 단어 sequelizeseedernode
Sequelize는 마이그레이션 또는 시드 파일의 이름을 SequelizeMeta 또는 SequelizeData 테이블에 각각 저장하여 데이터베이스 테이블 상태를 관리합니다.
전제 조건: Sequelize에 대해 이미 알고 있고 시더를 설정해야 합니다. 그렇지 않은 경우 에서 내 튜토리얼을 진행하십시오.

문제



Sequelize에 의해 추적된 시드 파일 없이 코드에 시드 파일(20200115143840-add-requesttypes.js)이 있는 Sequelize 프로젝트를 유지 관리하기 시작했습니다. 더 많은 시드 데이터(파일)를 추가해야 했습니다. 그러나 그렇게 했을 때 Sequelize는 전체 시드 파일을 다시 실행하여 이미 존재하는 시드 데이터를 복제하고 새 데이터를 추가합니다.

이것은 우리에게 큰 문제였으며 프로덕션에서 이 문제를 수정해야 했습니다.

시더즈 파일을 추적하기 위해 시퀄라이즈를 허용하는 구성 파일이 추가되지 않았음을 깨달았습니다.

module.exports = {
    .......
    seederStorage: 'sequelize'
}


이 시간에 이 구성을 추가하면 Sequelize가 여전히 이전 시드 파일(들)을 다시 실행하고(이것이 바로 우리가 방지하고자 했던 것입니다) 새 파일을 실행한다는 의미입니다.

솔루션



이 문제를 해결할 수 있는 두 가지 방법이 있습니다.
  • 데이터베이스에서 직접.
  • 백엔드 코드를 업데이트합니다.

  • 데이터베이스에서 직접



    이 문제를 해결하고 Sequelize를 계속 사용하는 가장 간단한 방법은 프로덕션 데이터베이스(앱이 연결된 다른 환경)로 이동하는 것입니다.

    열 이름과 유형 문자열을 사용하여 SequelizeData 테이블 만들기

    CREATE TABLE SequelizeData (
      name varchar(255) not null,
    );
    


    기존 시드 파일의 이름을 추가합니다. 우리의 경우 기존 시드 파일이 하나만 있었습니다.

    INSERT INTO SequelizeData
        (name)
    VALUES ('20200115143840-add-requesttypes.js');
    


    이제 Sequelize 구성 파일로 이동하여 seederStorage를 추가하십시오.

    module.exports = {
        .......
        seederStorage: 'sequelize'
    }
    


    이제 문제 없이 새 시드 파일을 추가할 수 있습니다. QA, DEV 및 기타 모든 환경 데이터베이스에 대해 동일한 작업을 수행해야 합니다.

    연속화



    문제를 해결하려면 Sequelize가 기존 시드 파일을 추적하고 추가될 새 시드 파일을 추적할 수 있어야 했습니다.

    먼저 SequelizeData 테이블을 생성해야 합니다.

    그래서 우리는 테이블을 생성하기 위해 마이그레이션 파일을 추가합니다.

    export default {
      up: (queryInterface, Sequelize) => {
        return queryInterface.createTable('sequelizeData', {
          name: {
            type: Sequelize.STRING,
            allowNull: false,
          },
        });
      },
      down: queryInterface => queryInterface.dropTable('sequelizeData')
    };
    


    그런 다음 기존 시드 파일의 이름을 테이블에 채웁니다(시작 시 시드 스크립트가 실행될 때 Sequelize가 파일을 실행하는 것을 방지하기 위해).

    다음으로, 시드 데이터가 통화 테이블에 존재하는지 확인하고 존재하지 않는 경우 추가합니다(이는 프로젝트를 설정하는 새로운 사람이 역할 시드 파일을 그대로 실행할 수 있도록 허용하기 위해 수행됩니다. DB에 존재하지 않음)

    export default {
      up: async (queryInterface) => {
        const currencyExist = await queryInterface.rawSelect(Currency, {
          where: {
            name: USD,
          },
        },
    , ['id']);
    
        if(!currencyExist) {
          await queryInterface.bulkInsert('sequelizeData', [
            {
              name: '20200115143840-users.js',
            },
          ], {})}
        },
    
      down: async (queryInterface) => {
        await queryInterface.bulkDelete('sequelizeData', null, {});
      }
    };
    


    다음은 Sequelize 구성 파일에서 seederStorage를 설정하는 것입니다.

    module.exports = {
      .....
      seederStorage: 'sequelize'
    }
    


    이제 코드를 살펴보겠습니다.
    가장 먼저 할 일은 requestType 데이터가 RequestTypes 테이블에 있는지 확인하는 것입니다. 그것이 있다면 우리는 이 시드를 실행하고 싶지 않습니다. 그렇지 않으면 실행할 것입니다.

    존재하지 않는 경우(현재의 경우) 기존 시드 파일의 이름을 후속 파일에 추가합니다.
    이것은 프로젝트를 처음부터 설정하는 모든 사람이 시드 파일을 문제 없이 실행할 수 있도록 하는 데 필요합니다(중요).

    이제 Sequelize는 기존 시드 파일을 추적하고 있으므로 계속해서 새 시드 파일을 추가하면 모든 것이 잘 될 것입니다.

    또한 프로젝트에 온보딩하는 사람은 누구나 문제 없이 로컬에서 프로젝트를 설정할 수 있습니다.

    이제 우리가 작업하고 있던 프로젝트에서 우리가 한 일은 코드로 수정하는 것입니다. 많은 환경(프로덕션, QA, 스테이징, 개발 등)이 있습니다. DB에서 수정하려면 모든 데이터베이스를 통해 수정해야 합니다.
    이를 수정하기 위해 코드를 작성하는 것은 우리에게 의미가 있습니다.

    참고 *** 이 구현은 작은 실수로 인해 치명적인 오류와 문제가 발생할 수 있으므로 철저히 테스트해야 합니다.

    마지막으로 데이터베이스와 원시 SQL 구문 및 사용 사례를 잘 이해하면 복잡한 데이터베이스 문제를 해결하는 데 항상 도움이 됩니다(사용 중인 도구에 관계없이).

    고맙습니다.
    Idris Kelani

    좋은 웹페이지 즐겨찾기