SELECT結果を複数確認できる仕組みをつくった

SELECTを複数実行して結果を見たいことはないでしょうか?
高級なデータベース開発ツールだとできますが、使えない現場もあります。
特にPostgreSQLで、そういうことをやろうとするのは難しいです。

この問題を解決するため、JavaScript上にSQLを記述してPHPからPostgreSQLに接続して結果を表示する仕組みを作りました。

dbgrid

これを表示するためのHTMLは以下のようになります。

<!DOCTYPE HTML>
<html>
<head>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/handsontable/0.20.0/handsontable.full.min.js"></script>
  <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/handsontable/0.20.0/handsontable.full.min.css">
  <title>dbgrid</title>
</head>
<body>
</body>
</html>

<script type="text/javascript">
var sql = (function () {/*
-- ここからSQLを記述します

SELECT *
  FROM dtb_test
 ORDER BY member_id DESC;

SELECT *
  FROM dtb_test
 ORDER BY member_id ASC;

-- ここまでSQLを記述できます
*/}).toString().match(/(?:\/\*(?:[\s\S]*?)\*\/)/).pop().replace(/^\/\*/, "").replace(/\*\/$/, "");

  var sql_list = sql.split(';');

  for (var i = 0; i < sql_list.length; i++) {
    var grid_id = "grid" + (i + 1);
    $('body').append("<div id='" + grid_id + "' style='font-family: monospace; margin-bottom: 10px; clear:both;'></div>");
    $.ajax({
      type: "POST",
      url: "get_data.php",
      data: "grid_id=" + grid_id + "&sql=" + sql_list[i],
      success: function (data) {
        var obj = $.parseJSON(data);
        if (obj.field.length) {
          var container = $('#' + obj.grid_id).get(0);
          var hot = new Handsontable(container, {
            data: obj.data,
            rowHeaders: true,
            colHeaders: obj.field,
            maxCols: 0,
            maxRows: 0
          });
        }
      }
    });
  }

</script>

記述したSQLの件数分、グリッドが生成されるようになっています。
残念ながらJavaScriptから直接データベースは操作できないので、PHP側が必要になります。

<?php
$grid_id = $_POST["grid_id"];

$conn = pg_connect("host=localhost dbname=postgres user=postgres password=password");
$result = pg_query_params($conn, $_POST["sql"], array());

$field_list = array();
$data_list  = array();

if ($result == FALSE) {
    array_push($field_list, "エラーメッセージ");
    $row_data = array();
    array_push($row_data , pg_last_error($conn));
    array_push($data_list, $row_data);
}

$col_count = pg_num_fields($result);
for ($i = 0; $i < $col_count; $i++) {
    array_push($field_list, pg_field_name($result, $i));
}

for ($i = 0 ; $i < pg_num_rows($result) ; $i++){
    $row_data = array();
    $rows = pg_fetch_array($result);
    foreach ($field_list as $field) {
        array_push($row_data, $rows[$field]);
    }
    array_push($data_list, $row_data);
}

pg_close($conn);

echo json_encode(array("grid_id"=>$grid_id, "field"=>$field_list, "data"=>$data_list));
?>

PostgreSQLの場合は、こんな感じです。
割とシンプルで使いまわせる仕組みなので、よかったら是非応用してみてください。
ローカルで動作させることしか考えていないので、間違っても公開サーバには上げないでください。

システム開発

Posted by @erestage