ダイナミックにデータベースを検索するアプリケーションなどで、アクセスするデータベースのテーブル構造を調べてから検索するような場合に利用できるテクニックです。
MySQLの指定したテーブルからサンプルデータをフェッチし、その結果から列情報を取得する方法です。
const mysql = require('mysql');
...
...
describe(connectionInfo, tableName, fetchLimit) {
// データベース接続情報
const conn = {
database: connectionInfo.database,
host: connectionInfo.host,
user: connectionInfo.user,
password: connectionInfo.password,
port: parseInt(connectionInfo.port)
};
return new Promise( (resolve, reject) => {
// データベースに接続
const connection = mysql.createConnection(conn);
if(!connection) {
reject({error: new Error('Invalid connection info'), status: 500});
} else {
// 総レコード数を取得
connection.query(`SELECT COUNT(*) FROM ${tableName}`, (err, results) => {
if(err) {
connection.end();
reject({error: new Error('Invalid query'), status: 500});
} else {
let response = {};
// 総レコード数を結果オブジェクトに保存
response.count = results[0]['COUNT(*)'];
// 検索レコード数に制限して検索実行
connection.query(`SELECT * FROM ${tableName} LIMIT ${fetchLimit}`, (err, results, fields) => {
connection.end();
if(err) {
console.log(err);
reject({error: new Error('Invalid query'), status: 500});
} else {
// fieldsにカラム情報が入っている
const columns = [];
fields.forEach( fp => {
columns.push( {
columnName: fp.name,
type: fp.type
});
});
// コラム情報を結果オブジェクトに保存
response.columns = columns;
// サンプルレコードを結果オブジェクトに保存
response.rows = results;
resolve(response);
}
});
}
});
}
});
}