Sequelize 마이그레이션을 사용하여 null이 아닌 고유한 새 열 추가

이 짧은 기사는 nodeJS에서 non-null 마이그레이션을 사용하여 기존 관계형 데이터베이스에 새 uniquesequelize 열을 추가하는 방법을 설명합니다.

Note: This is for development environments and not recommended for production.



때때로 응용 프로그램을 작성하는 동안 현재 테이블을 삭제하지 않고 기존 데이터베이스에 null이 아닌 고유한 새 열을 추가해야 할 수 있습니다. 한 곳에서 완벽한 솔루션을 찾을 수 없었기 때문에 여기에서 이 문제를 해결하려고 시도합니다.

문제 설명



다음 열이 있는 users 테이블이 있고 이제 테이블을 삭제하지 않고 고유하고 null이 아닌 새username 열을 추가하려고 합니다.

| id | name  | email                 | age | hobby   |
|----|-------|-----------------------|-----|---------|
| 1  | bob   | [email protected]          | 23  | coding  |
| 2  | alice | [email protected]   | 25  | dance   |
| 3  | John  | [email protected]   | 22  | singing |
| 4  | frank | [email protected]      | 28  | reading |

해결책



한 가지 간단한 해결책은 email 열에 동일한 username 필드를 삽입하는 것인데 둘 다 고유하기 때문에 이것이 가능하지 않은 일반적인 예를 들어 보겠습니다.
sequelize-cli를 사용하여 마이그레이션 파일을 만들어 시작해 보겠습니다.

npx sequelize migration:create --name=add_username_users

의사 코드의 화면 캡처는 다음과 같습니다.


설명하기 위해 먼저 username 열을 성공에 대한 제약 조건으로 추가하고 원하는 논리로 새로 추가된unique 열의 모든 행을 업데이트하는 논리를 작성합니다. 나는 username 쿼리에서 { type: QueryTypes.SELECT }를 사용했습니다. 여기에는 메타데이터가 필요하지 않고 쿼리 결과를 성공 시 배열로 가져오려면 열이 SELECT 제약 조건을 추가하도록 변경됩니다. Sequelize 마이그레이션의 다운 부분에서는 not-null 열만 삭제됩니다.

다음은 임의로 생성된 사용자 이름으로 새 열을 추가하는 최종 코드입니다. 나중에 업데이트하거나 개발 환경 중에 그대로 유지할 수 있습니다.

const { QueryTypes } = require('sequelize');
module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.addColumn('users','username',{
      type: Sequelize.STRING,
      unique: true
    }).then((data) => {
      queryInterface.sequelize
        .query(`SELECT id from users`, {
          type: QueryTypes.SELECT
        })
        .then((rows) => {
          rows.map((row) => {
            queryInterface.sequelize.query(
              `UPDATE users SET username='${Math.random()
                .toString(36).substr(2, 8)}' WHERE id=${row.id};`
            );
          });
          Promise.resolve();
        })
        .then(() => {
          queryInterface.changeColumn('users', 'username', {
            type: Sequelize.STRING,
            allowNull: false
          });
        });
    })
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn('users', 'username');
  }
};

읽어주셔서 감사하고 이에 대한 의견을 공유해 주세요.

참조:
무작위 생성: stackOverflow answer
코드 아이디어: sequelize github issue

좋은 웹페이지 즐겨찾기