본문 바로가기

블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기

[58일차 복습] mysql table 을 sequelize auto 사용해서 JavaScript로 자동으로 가져오기 / 데이터베이스 테이블 sequelize로 옮기기

반응형

 

 

mysql 에 기생성된 database, tables를 sequelize 사용해서 js로 가져오기 

 

 

1. 기본 server.js 세팅 

$npm init

$npm i express

 

server.js

const express = require('express');
const app = express();

app.get('/',(res,req)=>{
    res.send('d');
})

app.listen(3000,()=>{
    console.log('server start port : 3000')
})

 

 

 

2. sequelize 다운/ 세팅 / 코드작성 / db연결 확인 

$npm i sequelize mysql2 sequelize-cli

$npx sequelize init

 

sequelize - > 클래스 사용 패키지

mysql2 -> db 접속역할

sequelize-cli -> npx 사용위한 패키지

npx sequelize init -> sequelize 폴더 3개 생성시킴

* 생성되는 폴더 config - db접속정보 / models - 우리가 만든 db를 객체로 하나로 담기위해 

config -> 나의 정보로 수정 (database name: class / password)

models -index.js 필요한 부분만 남기기 

'use strict';

const Sequelize = require('sequelize');
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);
}

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

sequelize 가져오는 코드 추가 / 연결 잘되었는지 확인하기 

server.js

const express = require('express');
const app = express();
const {sequelize} = require('./models');   // index.js 에서 exports하는 객체db의 sequelize만 가져옴

sequelize.sync({force:false,})
.then(()=>{
    console.log('접속 완료');
}).catch(()=>{
    console.log('접속 실패');
})

app.get('/',(res,req)=>{
    res.send('d');
})

app.listen(3000,()=>{
    console.log('server start port : 3000')
})

 

 

 

 

3. sequelize-auto  - db 에 있는 tables 가져와서 그대로 모델.js를 만들어 주기 

$npm i sequelize-auto  (콘솔 명령어이다.)

-o "경로"     <- models을 만들 곳 지정 / 요기만 only STRING 

-d database

-h url( = localhost)

-u root

-p port

-x password

-e DBMS name(= mysql) 

터미널 명령어 실행

$sequelize-auto -o"./models" -d class -h localhost -u root -p 3306 -x root -e mysql

오류 해결 ↓↓

$npm install -g sequelize-auto 

다시 명령어 npx 붙여서 실행 

$npx sequelize-auto -o "./models" -d class -h localhost -u root -p 3306 -x [비번] -e mysql

 

이번엔 mysql2 ERROR :Please install mysql2 package manually

오류 해결 ↓↓

$npm i -g mysql2  

다시 명령어 실행 

$npx sequelize-auto -o "./models" -d class -h localhost -u root -p 3306 -x [비번] -e mysql

 

done!! 

class database에 있던 tables 3개가 잘 들어왔다. 

 

 

 

 

4. class DB에 있는 tables 가져와서 모델로 만들어주기

index.js - 코드 5줄 추가 

'use strict';

const Sequelize = require('sequelize');
const initModels = require('./init-models'); //추가 1
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);
}

let models = initModels(sequelize) //추가 2 (init-models의 function 한 것)

db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.curriculum = models.curriculum; // 추가 3
db.skill_item = models.skill_item; // 추가 4
db.skill = models.skill;  // 추가 5

module.exports = db;

 

 

 

5. 가져온 것 사용해보기

server.js

const express = require('express');
const app = express();
const {sequelize} = require('./models');
const {curriculum, skill_item, skill} = require('./models'); // 추가요

sequelize.sync({force:false,})
.then(()=>{
    console.log('접속 완료');
}).catch(()=>{
    console.log('접속 실패');
})

app.get('/',async (res,req)=>{
    let result = await curriculum.findAll();  // == select * from curriculum
    console.log(result);
    res.json({result});
})

app.listen(3000,()=>{
    console.log('server start port : 3000')
})

curriculum 말고 skill을 사용해보면 오류가 난다. 

해결법 ↓↓

 

init-models

function initModels(sequelize) {
  var curriculum = _curriculum(sequelize, DataTypes);
  var skill = _skill(sequelize, DataTypes);
  var skill_item = _skill_item(sequelize, DataTypes);
  var test = _test(sequelize, DataTypes);

  skill.removeAttribute('id');

  return {
    curriculum,
    skill,
    skill_item,
    test,
  };
}

id 지워주기 - skill 사용할 때 id라는 속성값을 없애겠다 ! 

 

위의 코드를 작성하면

server.js

app.get('/', async (req,res)=>{
    let result = await skill.findAll();
    console.log(result)
    res.json({result});
})

결과가 잘 나온다. 

 

 

 

 

 sequelize left join 

 

app.get('/', async (req,res)=>{
    let result = await skill.findAll({
        include:{model:skill_item,as:"item"}
        
    });
    console.log(result)
    res.json({result});
})

-

app.get('/', async (req,res)=>{
    let result = await skill.findAll({   // 주 테이블은 skill 
        include:{model:skill_item,as:"item"},  //skill_item table과 조인하겠다. as item
        where:{curr_id:5}   // curr_id가 5인 곳에서 
        
    });
    console.log(result)
    res.json({result});
})

 

반응형