PostgreSQLでテーブルにカラムを追加してみた
とあるシステムに機能追加することになって、どうしても既存のテーブルにカラムを追加する必要が出てきて困ったのでメモ。
絶対停止しちゃダメっていうシステムではないんだけど、なるべく止めないでっていう感じのもの。
alter table table_a add column colimn_a int not null default '1';
みたいにしたら返事が返ってこなくなった。defaultとか指定すると既存のレコードにも影響するから処理が重くなるらしい。※でも自分の環境では指定してもしてなくても返事が無くなった。
思い悩んだ挙句、一度既存テーブルのレコードをcsvにエクスポートしてからそのcsvを加工して空のテーブル作って加工したcsvインポートしてrenameでテーブル差し替えるのが時間的には早かった(と思う)。
※もっとスマートなやり方があるような気がしてるけど分からなかった。良いやり方があったら教えていただけると嬉しいです。
エクスポートして
copy table_a to '/tmp/db_export.csv' with csv delimiter ',';
データ加工して(今回viでやっちゃったけど、pandasとか使うとスマートなのかな)
空のテーブル作って
create table table_a_tmp(
column_1 varchar(100) not null unique,
column_2 varchar(512) not null,...
colimn_a int not null default '1'
);
作った空のテーブルに加工したファイルインポートして
copy table_a_tmp from '/tmp/db_export.csv' with csv delimiter ',';
既存テーブルを別名に退避させてから
alter table table_a rename to table_a_bk;
仮で作ったテーブルをを本番テーブル名に名前変更
alter table table_a_tmp rename to table_a;
この後にプログラムファイルを差し替えて動作確認
こんな感じ。