Skip to content

Instantly share code, notes, and snippets.

@kazz12211
Last active October 30, 2019 23:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kazz12211/3bb308e2122f0563b39d6f7f5a67f0a4 to your computer and use it in GitHub Desktop.
Save kazz12211/3bb308e2122f0563b39d6f7f5a67f0a4 to your computer and use it in GitHub Desktop.
MySQLでテーブルから列情報を取得する - Node.js + MySQL

ダイナミックにデータベースを検索するアプリケーションなどで、アクセスするデータベースのテーブル構造を調べてから検索するような場合に利用できるテクニックです。

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);
                }
              });
            }
          });
        }
      });
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment