Postgresでテーブルのカラム名を取得する方法【information_schemaを使おう】

Postgresでテーブルのカラム名を取得する方法【information_schemaを使おう】プログラミング
Postgresでテーブルのカラム名を取得する方法【information_schemaを使おう】

PostgresでInsertする時に特定のカラムだけ変更してInsertしたい時ってありますよね。

あの時ってみなさんはどうしていますか?

僕は1つ1つカラム名を記載して…と面倒な方法をとっていましたが、この記事で紹介する方法を知ってからだいぶ楽になりました。

今回はそのあたりを解説したいと思います。

ちなみにこの記事ではCakephpを率いた方法となりますが、スクラッチや他のフレームワークでも使える方法かと思います。

このブログは現役のエンジニア(プログラマー歴が約12年)の僕(よしたか)が2019年12月後半から日々更新しております。

もしもアフィリエイトは会員登録後も無料です!
今すぐ会員登録してアフィリエイトを始めよう!

Postgresで特定テーブルのカラム名を取得する方法

ではカラム名を取得する方法を見ていきたいと思います。

information_schema

『information_schema』とはデータベース内の様々なメタデータを格納しています。

その為、『information_schema』を使うと様々な情報が取得できます。

information_schemaでテーブルのカラム名を取得する方法

『information_schema』でカラム名を取得する方法ですが、

SELECT
    column_name
FROM
    information_schema.columns
WHERE
    table_name = 'test'
ORDER BY
    ordinal_position;

このようにクエリを実行すると『test』というテーブルのカラム名が全て取得できます。

『ordinal_position』はカラムの位置となりますので、ソートしておくのがいいでしょう。

 

以下はCakephp(queryメソッド)で、『test』というテーブルの『name』というカラムのみ変更してInsertする手順となります。

Cakephpで実際に利用する例

$column_sql = "
    SELECT
        column_name
    FROM
        information_schema.columns
    WHERE
        table_name = 'test'
    ORDER BY
        ordinal_position
";
$column_sql_res = $Model->query($column_sql);

まず『test』テーブルのカラム名を取得します。

$columns_array1 = [];
$columns_array2 = [];
foreach($column_sql_res as $key => $value) {
    $value = $value[0];
    if($value['column_name'] == 'id') {
        continue;
    }
    $columns_array1[] = $value['column_name'];
    if($value['column_name'] == 'name') {
        $columns_array2[] = '変更するname';
    }else{
        $columns_array2[] = $value['column_name'];
    }
}

次にInsertするカラムをまとめます。

この例では『name』カラムだけ変える手順となります。(idはインクリメントと仮定して除外しておきます)

$insert_sql = "
    INSERT INTO
    test (%s)
    SELECT %s FROM test
";
$insert_sql = sprintf(
    $insert_sql
    , implode(',', $columns_array1)
    , implode(',', $columns_array2)
);
$insert_sql_res = $Model->query($insert_sql);

最後にInsertクエリを形成して実行するだけですね。

1つ1つカラムを手動で記載するよりもだいぶ楽になりますよね。

その為、テーブル構成が変わってもいちいちソースを編集する必要がありません。

まとめ

この記事のおさらい
  • Postgresでカラム名を取得したい場合は『information_schema』を使おう

いかがだったでしょうか。

こういった1つ1つのプログラミングを簡素にしていくと、後々の運用もだいぶ変わってきます。

なんだか面倒くさいな~と思ったら、楽になる方法を探すのが吉ですね。