osprey's diary

日々の雑感を書き綴ります

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;

 

この後にプログラムファイルを差し替えて動作確認

 

こんな感じ。