js

sequelize-cli와 sequelize-auto

발전생 2021. 8. 17. 14:42

mysql workbentch를 사용하는 것도 db 모델링하는 좋은 방법이다.

하지만 sequelize-auto로 연동할 경우 init_models.js 수정, 클래스에서 created_at, update_at, defaultValue를 직접 설정해줘야 한다. 하지만 workbentch에서 테이블 간의 관계를 잘 만들어놓았으면 auto가 관계까지 잘 가져온다. mysql workbentch에 created_at, update_at 필드를 만들어주고 default value에 now()를 넣으면

updated_at: {
      type: DataTypes.DATE,
      allowNull: true,
      defaultValue: Sequelize.Sequelize.literal('CURRENT_TIMESTAMP')
    }

이렇게 defaultValue에 sequelize가 인식하는 now가 들어간다.

 

필드에 createdAt, updatedAt (camel case)을 넣으니 auto가 timestamps: true 설정을 테이블 생성 파일에 넣어주는 걸로 확인됐다.

 

다른 방법인 sequelize cli도 살펴봤다.

sequelize cli를 사용하니까 foreign key 관계 설정을 위해 associtae 함수 내에서도, foreign key 필드에서도 테이블 간의 관계를 만들어주기 위한 코드 작성이 필요하다. 대부분의 RDB는 테이블 간의 관계가 많이 얽혀있을텐데 이걸 다 작성하려니 이것도 만만치 않다. 그래서 그냥 sequelize-auto를 쓰려 한다.

npx sequlieze init

sequelize-cli를 전역으로 설치 안 했다면 앞에 npx를 붙여줘야 한다.

이 명령어를 사용허면 models에 index.js, init-models.js가 자동으로 생성된다. model들이 잘 import될 수 있도록 안에 코드까지 작성되어 있다. config 폴더와 config.json 파일도 생긴다. 이 안에서 database 연결 설정을 작성할 수 있다.(데이터베이스 host 이름, 사용자 이름 등등)

 

npx sequelize model:generate --name Sample --attributes name:string,engName:string,icon:string

model:generate 명령어를 사용하면 --name을 테이블 네임으로 가지고 --attributes 뒤에 적힌 필드들을 가지는 테이블을 생성할 수 있게 해주는 파일이 migrations에 생성된다. 이 안에 타입들이 정의되어 있는데 id, createdAt, updatedAt이 자동으로 생성된다. 굉장히 좋은 기능이다.

migrations 폴더에 만들어진 파일이다.

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('Samples', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      engName: {
        type: Sequelize.STRING
      },
      icon: {
        type: Sequelize.STRING
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('Samples');
  }
};

 

models 폴더에 --name에 넣어준 값을 이름으로 가지는 js 파일도 생성된다. sample.js 파일이 아래와 같이 생성됐다.

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Sample extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  };
  Sample.init({
    name: DataTypes.STRING,
    engName: DataTypes.STRING,
    icon: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'Sample',
  });
  return Sample;
};

associate 함수 내에서 다른 테이블과의 관계를 정의할 수 있다. belongsTo, hasMany 등의 함수가 사용된다.

 

 

데이터베이스 생성 코드를 모두 작성한 후에는

npx sequelize db:migrate

를 사용하면 된다. 그러면 config.json에 적혀있는 호스트에 연결돼서 데이터베이스가 만들어진다.