Sequelize - 관계설정 및 DB생성

Jay·2021년 1월 27일
4

Sequelize 🤔 ?

Sequelize는 Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server를 지원하는 Promise 패턴 기반의 Node.js ORM입니다. Solid 트랜잭션, 관계 설정, 즉시 로딩, 지연 로딩, 읽기 전용 복제본 등을 포함해 많은 기능을 제공합니다.

https://sequelize.org/

프로젝트 시작

1. 시작 전 npm install

npm i --save sequelize mysql2
npm i --g sequelize-cli
ㄴ sequelize-cli가 이미 설치되어있다면, 다시 설치 할 필요없다.

2. 루트폴더 진입

sequelize init

3. 기초 설정 완료

sequelize init 을 하게되면, 몇가지 폴더와,파일들이 생성된다.

config.json

DB 연결 정보를 저장

{
  "development": {
    "username": "root",
    "password": null,
    "database": "database_development",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

migrations

마이그레이션에 필요한 데이터가 자동으로 저장

sequelize db:migrate 명령어를 통하여 마이그레이션 한다.

models

DB 모델 정의를 저장

테이블 생성은 아래의 명령어로 한다.

npx sequelize-cli model:generate --name '테이블명' --attributes

firstName:string,lastName:string,email:string

위 두줄을 이어붙여 사용하여
두번째 줄의 컬럼명과 타입을 변경하여 사용하면 된다.

seeders

테스트에 필요한 데이터를 정의
npx sequelize-cli seed:generate --name demo-user
ㄴ 명령어를 입력하면 생성된 마이그레이션 파일의 테이블 형식에 맞는 시드파일을 만들어준다.
ㄴ 시드 파일을 수정 후 아래의 명령어를 입력하여 생성된 테이블에 데이터를 심어줄 수 있다.
sequelize db:seed:all

DB생성

sequelize init 후 , 공식문서를 참고하였다.

Creating the first Model (and Migration)

모델 생성

유저
$npx sequelize model:generate --name User --attributes userName: string

텍스트
$npx sequelize model:generate --name Text --attributes textContent: string

DB생성 & Migrate

$npx sequelize-cli db:create
$npx sequelize-cli db:migrate
DB를 생성해주고 , migrate를 통해 데이터베이스 안에 뼈대를 설계해주었다.

mysql 생성 여부 확인

정상 생성되었다.

Creating the first Seed

시드파일 생성

npx sequelize-cli seed:generate --name user
npx sequelize-cli seed:generate --name text

시드 내용

//user seed

'use strict';
const createdAt = new Date();
const updatedAt = new Date();

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert(
      'Users',
      [
        {
          userName: 'Mike tyson',
          createdAt,
          updatedAt,
        },
        { userName: 'BTS', createdAt, updatedAt },
      ],
      {}
    );
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete('User', null, {});
  },
};

//Text seed
'use strict';
const createdAt = new Date();
const updatedAt = new Date();

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert(
      'Texts',
      [
        {
          message: 'love boxing',
          createdAt,
          updatedAt,
        },
        {
          message: 'love singing',
          createdAt,
          updatedAt,
        },
      ],
      {}
    );
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete('Text', null, {});
  },
};

시드 데이터 추가

seeders 폴더의 seed

text.js, user.js 에 위의 내용을 작성 후

$ npx sequelize db:seed:all 명령어 실행

데이터를 2개씩 넣어줬다.

DB에 정상적으로 추가된 내용을 확인할 수 있다.

모델,DB 작동 여부 확인

src>index에 아래와 같이 데이터를 얻어내는 함수를 선언, 사용했다.

const { User: user } = require('../models');
const { Text: text } = require('../models');

//get user data
async function getAllUserInfo() {
  const userData = await user.findAll();

  console.log(userData);
}

async function getUserFromName(name) {
  const userData = await user.findOne({
    where: { userName: name },
  });

  console.log(userData);
}

//get text data

async function getAllTextInfo() {
  const textData = await text.findAll();

  console.log(userData);
}

async function getTextFromId(id) {
  const userData = await user.findOne({
    where: { id: id },
  });

  console.log(userData);
}

getAllUserInfo();
getUserFromName('BTS');

getAllTextInfo();
getTextFromId(2);

정상 작동한다.👏


관계구성 설정하기

models/index.js , models/text.js를 migrate 후,
그 안에서 관계 구성을 해주었어야했다.

mysql에서 drop database 'DB명'을 통해 삭제 후 다시 할 수도 있지만,

명령 전으로 되돌리는 undo 기능이 생각났다.

이럴때 한번 써보는거지뭐... 😅

undo를 활용한다.

npx sequelize-cli db:migrate:undo
npx sequelize-cli db:seed:undo:all

DB를 조회해보니 테이블들이 삭제되었다.


다시 models의 user.js, text.js 의 관계들을 정의할 것이다.

관계구성 정의하기[1]

//user.js
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    static associate(models) {
      this.hasMany(models.Text);
    }
  }
  User.init(
    {
      userName: DataTypes.STRING,
    },
    {
      sequelize,
      modelName: 'User',
    }
  );
  return User;
};
// text.js
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Text extends Model {
    static associate(models) {
      this.belongsTo(models.User);
    }
  }
  Text.init(
    {
      message: DataTypes.STRING,
    },
    {
      sequelize,
      modelName: 'Text',
    }
  );
  return Text;
};

관계구성 정의하기[2]

구글링을 하며 알게되었는데 associate 부분(this.belongsTo)을 비우고,
models>index.js 에서 정의하는 방법도 있었다. 😓

index.js 하단에 정의해주면 된다.

const { text, user } = sequelize.models;
text.belongsTo(user);
user.hasMany(text);

더 연습해봐야겠다. : )

profile
programming!

0개의 댓글