PostgresでInsertする時に特定のカラムだけ変更してInsertしたい時ってありますよね。
あの時ってみなさんはどうしていますか?
僕は1つ1つカラム名を記載して…と面倒な方法をとっていましたが、この記事で紹介する方法を知ってからだいぶ楽になりました。
今回はそのあたりを解説したいと思います。
ちなみにこの記事ではCakephpを率いた方法となりますが、スクラッチや他のフレームワークでも使える方法かと思います。
もしもアフィリエイトは会員登録後も無料です!
今すぐ会員登録してアフィリエイトを始めよう!
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つカラムを手動で記載するよりもだいぶ楽になりますよね。
その為、テーブル構成が変わってもいちいちソースを編集する必要がありません。
まとめ
いかがだったでしょうか。
こういった1つ1つのプログラミングを簡素にしていくと、後々の運用もだいぶ変わってきます。
なんだか面倒くさいな~と思ったら、楽になる方法を探すのが吉ですね。