[MySQL] mysql 및 sequelize 사용법(1)

Arin·2021년 6월 30일
0

database

목록 보기
2/2

시퀄라이즈 설치

npm install -g sequelize-cli

시퀄라이즈 초기화

sequelize init

model생성

sequelize model:generate --name {모델명} --attributes {속성:타입},{속성:타입}

sequelize model:generate --name users --attributes email:string, age:number

이렇게 만들면 model폴더에 index.js와 users.js 파일이 생긴다.
동시에 migrations폴더에 {날짜}-create-users.js 파일도 동시에 생김.

model/index.js

'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

/**
 * fs : 파일을 입출력해주는 라이브러리
 * readdirSync('파일경로') : 디렉터리 기반 상대경로로 읽어냄.
 */

/**
 * path : 파일과 디렉토리 경로를 정확히 맞춰줌
 * path.basename() : 파일이름을 출력한다.
 * path.join(): 플랫폼별(windows냐 mac이냐) 구분자를 사용해서 경로를 정규화해서 리턴
 * 
 */

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
   // (file.indexOf('.') !== 0)  '.'을 발견하는 인덱스가 0 이 아닐 경우
    // (file !== basename) basename으로 파일 이름이 축출되고
    // (file.slice(-3) === '.js') 확장명이 'js' 인 경우
    //모두 만족하는 요소들만 필터링되도록
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
    // db가 빈 객체였는데, 여기에 요소를 채우기 시작.
  }
});
// 모델들을 모두 db와 연결.
db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

fs와 path는 파읽을 불러오고, 읽어낼때 사용하는 라이브러리이다. 파일 경로 설정을 정확하게 할 수 있는 장점이 있다.
index.js 파일에서는 모델들을 불러와서 db와 연결해 주는 역할을 한다. index.js 파일은 db요소를 배출해 낸다.

model/users.js

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class users 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
      this.hasMany(models.reviews, {
        foreignKey: 'users_id',
        sourceKey: 'id',
        onUpdate: 'cascade',
        onDelete:'set null'
      })

      this.belongsToMany(models.bootcamp_lists, {
        through: 'users_bootcamp',
        targetKey: 'id',
        foreignKey: 'users_id',
        onUpdate: 'cascade',
        onDelete: 'cascade'
      })
    
    }
  };
  users.init({
    name: DataTypes.STRING,
    active: DataTypes.BOOLEAN,
    email: DataTypes.STRING,
    role: {
      type: DataTypes.ENUM,
      values: ['manager', 'user', 'partner']
    }
  }, {
    sequelize,
    modelName: 'users',
    timestamps: true,
    charset: 'utf8'
  });
  return users;
};

class 버전말고 define 버전도 있는데 나는 그냥 처음 설정대로 사용함. associate부분은 다른 모델과 관계설정 해주는 부분이다. 이부분이 꽤나 복잡함.

users.init({params1},{params2})여기에서 params1은 데이터이름과 데이터 타입을 설정하는 구간이다. params2은 부수적인 설정을 해주는 위치이다. 모델이름, encoding방식, 그리고 timestamps을 사용할지 말건지 등을 결정해서 정한다.

migrations/20210606231115-create-users.js

'use strict';
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable('users', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      name: {
        type: Sequelize.STRING
      },
      active: {
        type: Sequelize.BOOLEAN
      },
      email: {
        type: Sequelize.STRING
      },
      role: {
        type: Sequelize.ENUM,
        values: ['manager', 'user', 'partner']
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    },
    { timestamp: true, underscored: false }
    ).then(function(){
      queryInterface.createTable('users_bootcamp', {
        id: {
          allowNull: false,
          autoIncrement: true,
          primaryKey: true,
          type: Sequelize.INTEGER
        },
        createdAt: {
          allowNull: false,
          type: Sequelize.DATE
        },
        updatedAt: {
          allowNull: false,
          type: Sequelize.DATE
        },
        users_id:{
          type: Sequelize.INTEGER,
          allowNull: true,
          onDelete: 'cascade',
          onUpdate: 'cascade',
          references:{model: 'users',key: 'id'}
        }
      },{
        timestamp: true, underscored: false
      })}
    )},
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable('users');
  }
};

createTable() 단어가 핵심 단어이다. 데이터 타입 설정이 model폴더에 있는 파일들과 같은 타입으로 설정되어 있어야 한다.

profile
2년차 프론트앤드

0개의 댓글