Node.JS-mysql 다중쿼리(+socket.io)

3 분 소요

node.js mysql 다중쿼리

1. 다중쿼리 설정

다중 쿼리를 사용하려면 다음과 같이 설정해주어야 한다.

multipleStatements: true

커넥션 생성 객체에 설정해둔다. 이렇게 해두면 ‘;’를 연속하여 다중쿼리 작성이 가능하다.

connection = mysql.createConnection({
    host     : '127.0.0.1',
    user     : 'ubuntu',
    password : '********',
    database : 'test_db',
    port: 3306,
    multipleStatements: true
  });

하지만 connection.query는 .on 을 분리하여 사용할 것이므로 위의 내용은 상관없다.


2. 쿼리문

mysql 컬럼 unique 설정으로 고유의 값으로 만들어준다.


3. ON DUPLICATE KEY 사용

ON DUPLICATE KEY UPDATE 뒤에는 키를 제외하고 update할 컬럼 나열한다.

값이 존재하지 않으면 INSERT 하고 그렇지 않다면 UPDATE 한다.

(예시)

INSERT INTO user_score(name) VALUES(‘support.samsungcloud.com2’) ON DUPLICATE KEY UPDATE name=’support.samsungcloud.com2’;


4. node.js 서버 소스코드(socket.io )

appUpdate.js

socket이 생성되는 이벤트가 발생되고 웹브라우저 클라이언트에서 ‘status added’ 이벤트가 발생하면 데이터를 전달 받는다. 그리고 add_status_simple 함수를 실행한다.

// socket 생성

io.sockets.on('connection', function(socket) {

  socket.on('status added',function(status){

    console.log('### update test value[0] >>> ', status[0]);
    console.log('### update test value[1] >>> ', status[1]);
    console.log('### update test value[2] >>> ', status[2]);
    add_status_simple(status,function(res){
      if(res){
          console.log('### update test value >>> ', res);
          io.emit('refresh feed',status);
      } else {
          io.emit('error');
      }
    });
  });

  new Promise(function(resolve, reject){
    setTimeout(function() {
      resolve();
      runSocketData();
    }, 200);
  })
  .then(function(result) {
    return result;
  });  

  socket.on('disconnect', function() {
    var socketIndex = connectionsArray.indexOf(socket);
    console.log('socketID = %s got disconnected', socketIndex);
    if (socketIndex) {
      connectionsArray.splice(socketIndex, 1);
    }
  });

});

5. 쿼리 실행 순서

  1. A테이블에서 점수를 수정한다.
  2. 70이상이면 B테이블에 등록한다.
  3. 70미만인데 B테이블에 있다면 삭제한다. (2번 이외 조건으로 실행 = else)
/* 점수 mysql update 시작*/
    var add_status_simple = function (status,callback) {
   
        var user_name = status[2];
        var query = connection.query('UPDATE user_score SET math_score = "'+status[1]+'" WHERE user_seq = "'+status[0]+'";');
    
        query
          .on('error', function(err) {        
            console.log(err);
          })
          .on('result', function(result) {
            console.log("query result",result);        
          })
          .on('end', function() {        
              console.log('쿼리 전송 완료');        
          });
        
        //점수가 70이상이라면 user_score 테이블에 등록
        if(status[1] >= 70){
          
          var time = new Date().toLocaleString();    
          var check = 'check';
          var host = 'desktop';
          var insert_query = connection.query('INSERT INTO user_score(name, date_created, check, pol_host) VALUES("'+user_name+'", "'+time+'", "'+check+'", "'+host+'") ON DUPLICATE KEY UPDATE name="'+user_name+'";');
          
          insert_query
          .on('error', function(err) {        
            console.log(err);
          })
          .on('result', function(result) {
            console.log("query result >>> ",result);   
            io.emit('70up_alert',status);
          })
          .on('end', function() {        
              console.log('쿼리 전송 완료');        
          });
    
        } else {
          //70미만으로 설정되면 삭제
          var del_query = connection.query('DELETE FROM user_score WHERE name = "'+user_name+'";');
          
          del_query
          .on('error', function(err) {        
            console.log(err);
          })
          .on('result', function(result) {
            console.log("query result >>> ",result);   
            io.emit('70down_alert',status);
          })
          .on('end', function() {        
              console.log('쿼리 전송 완료');        
          });
        }
    }
    /* 점수 mysql update 끝*/

6. 클라이언트 소스코드

index.html 값이 제대로 전달이 안되는 경우 socket.io가 원인인 경우가 크다. socket.io를 다시 실행해보자.

<script src="http://127.0.0.1:8000/socket.io/socket.io.js"></script>

<script>
$(document).ready(function(){
      //var socket = io();
      //var socket = io.connect('http://15.164.94.221:8000');
      var socket = io.connect('http://127.0.0.1:8000');
      var user_arr =[];
      $("#add_status").click(function(){

        var e = document.getElementById("user_score");
	 //select value
        var user_score = e.options[e.selectedIndex].value;      
        //db에서 가져온 값
        var user_seq = '<%=info.getUserSeq()%>';
        var user_name = '<%=info.getUserDomain()%>';
               
        user_arr[0] = user_seq;
        user_arr[1] = user_score;
        user_arr[2] = user_name;
        
        socket.emit('user data',user_arr);
      });     
      
      socket.on('70up_alert',function(msg){          
            alert("70이상 설정 완료");
      });    
      
      socket.on('70down_alert',function(msg){          
            alert("70미만 해제");
      });    
});
</script>

DB

점수를 수정할 테이블 A

CREATE TABLE `user_tb` (
    `user_seq` INT(20) NOT NULL AUTO_INCREMENT COMMENT 'user 일련번호',
    `user_host` VARCHAR(50) NULL DEFAULT NULL COMMENT 'user 호스트',
    `user_name` VARCHAR(50) NULL DEFAULT NULL COMMENT 'user 이름',,
    `user_id` VARCHAR(50) NULL DEFAULT NULL COMMENT 'user 로고',
    `user_memo` VARCHAR(50) NULL DEFAULT NULL COMMENT 'user 메모',
    `user_status` INT(3) NULL DEFAULT '1' COMMENT 'user 관리상태',
    `math_score` VARCHAR(40) NULL DEFAULT '0' COMMENT '점수 70%이상 ',
    `user_time` INT(11) NULL DEFAULT NULL COMMENT 'user 등록시간',
    PRIMARY KEY (`user_seq`),
    INDEX `user_host` (`user_host`)
)
COMMENT='user score list'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=59
;

70이상이면 등록(또는 미만이면 삭제)할 테이블 B

CREATE TABLE `user_score` (
    `site_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '인텍스',
    `name` VARCHAR(255) NOT NULL COMMENT '이름',
    `memo` VARCHAR(255) NULL DEFAULT NULL COMMENT '비고',
    `date_created` DATETIME NULL DEFAULT NULL COMMENT '등록일',
    `host` VARCHAR(50) NULL DEFAULT NULL COMMENT 'host PC/Mobile 구분',
    `check` VARCHAR(10) NULL DEFAULT NULL,
    PRIMARY KEY (`site_id`),
    UNIQUE INDEX `name` (`name`)
)
COMMENT='학생 점수'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=259
;

태그:

카테고리:

업데이트:

댓글남기기