【Node.js】AWS Lambda에서 MySQL(AWS RDS)의 레코드 개수를 취득

Node.js에서 AWS RDS (MySQL) 레코드 수를 얻는 데 상당히 빠져서 여기에 적습니다.

환경 및 시스템 구성



· node.js v14.5.0
・AWS Lambda로부터 AWS RDS(MySQL)의 정보를 취득


방법



SQL 문에서 테이블의 수를 가져올 때,
예를 들어, users 테이블의 컬럼 userID 수를 얻으려면 다음 SQL 문이 있습니다.
SELECT COUNT(*) from users where userId ='userID';

이것을 Lambda에 node.js로 쓰면

index.js
'use strict';
const mysql = require('mysql');

exports.handler = function (event, context) => {

    const connection = mysql.createConnection({
        host     : 'xxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント
        user     : 'admin', //MySQLのユーザ名
        password : 'xxxxx', //MySQLのパスワード
        database : 'xxxxx' //データベース名
    });

    let sql = "SELECT COUNT(*) from users where userId = '"+userId+"';";
    connection.query( sql, function(err, rows, fields) {
        if (err) throw err;
        console.log(rows);        
    });
}

행에 숫자가 저장되어 있어야하지만,
콘솔에
[ [RowDataPacket] ]

뭔가 잘 모르기 때문에,
console.log(rows[0]);

그렇다면
RowDataPacket { 'COUNT(*)': 1 }

이 'COUNT(*)'의 값을 얻으려고 생각하면,
console.log(rows[0].RowDataPacket.COUNT(*));

그러나 이것은 문법 오류입니다.
SyntaxError: Unexpected token '*'

어떻게 하면 돼.

SQL문의 COUNT(*) 뒤에 As count 를 넣으면 됩니다.
SELECT COUNT(*) AS count from users where userId ='userID';

오, 뭔가 좋은 느낌이되었습니다.
RowDataPacket { count: 1 }

그러나 사실 이것은 JSON처럼 보이지만 JSON은 아닙니다.
RowDataPacket으로 나오면,
JSON.stringify()에서,
JSON으로 변환해야합니다.
console.log(JSON.stringify(rows[0]));

오, 좋은 느낌.
{
    "count": 1
}

이것으로 어때!
console.log(JSON.stringify(rows[0]).count);

라고 생각하면, 저기?
undefined

사실,
일단 parse 하지 않으면 안됩니다.
console.log(JSON.parse(JSON.stringify(rows[0])).count);  

드디어 수치를 취할 수 있었습니다.
1

요약하면 이것이 정답입니다.

index.js
'use strict';
const mysql = require('mysql');

exports.handler = function (event, context) => {

    const connection = mysql.createConnection({
        host     : 'xxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント
        user     : 'admin', //MySQLのユーザ名
        password : 'xxxxx', //MySQLのパスワード
        database : 'xxxxx' //データベース名
    });

    let sql = "SELECT COUNT(*) AS count from users where userId = '"+userId+"';";
    connection.query( sql, function(err, rows, fields) {
        if (err) throw err;
        console.log(JSON.parse(JSON.stringify(rows[0])).count);
    });
}


추기 (실은 더 간단한 방법이・・・)



여기까지 읽어 주셔서 감사합니다.

실은, 이런 귀찮은 일을 하지 않아도, 간단한 방법이 있었습니다!

트위터로, 친절한 분이 가르쳐 주었습니다.

rows[n]로 1개의 객체가 되어 있으므로, 단순히 rows[0].count 또는 rows[0]["count(*)"]로 갈 수 있어요! - masaki ohashi (@ohashimasaki) June 17, 2021




이것입니다.



console.log(rows[0].count);




즉,




index.js

'use strict';
const mysql = require('mysql');

exports.handler = function (event, context) => {

    const connection = mysql.createConnection({
        host     : 'xxxx.xxxxxxx.ap-northeast-1.rds.amazonaws.com', //RDSのエンドポイント
        user     : 'admin', //MySQLのユーザ名
        password : 'xxxxx', //MySQLのパスワード
        database : 'xxxxx' //データベース名
    });

    let sql = "SELECT COUNT(*) AS count from users where userId = '"+userId+"';";
    connection.query( sql, function(err, rows, fields) {
        if (err) throw err;
        console.log(rows[0].count);
    });
}





아니-, 도대체 나는 무엇을 하고 있어라···.



라고 해도 시행착오는 중요합니다.

라고 자신에게 말하게 합니다.






참고 사이트



How to get COUNT(*) variable





좋은 웹페이지 즐겨찾기