[PostgreSQL] テーブルの拡張

※当サイトでは広告を掲載しています

一般的に、DBのデータを他のマシンにコピーしたい場合は、dataディレクトリをまるごと持っていくか、pg_dumpを使うと思われる。しかし、DBのデータを他のマシンにコピーするときに、ついでにテーブルの拡張をしたいときは、どうすればいいだろう・・・。データの件数が少なければ、手作業で書き換えてもいいけれど、数千件もあるものを手作業で書き換えるのはちょっと考え物。

そんな作業をしなくてはいけなくなったので、ちょっと調べてみた。

やりたいこと

既存のDBにあるテーブルのいくつかに、カラムを追加する。
追加したカラムには、他のテーブルの値をセットする。
具体的には、tblAに新たにclmDを追加して、そのカラムの値には、tblBのclmCを入れたい。その際に、tblAのclmAと、tblBのclmBが同じものに限る。といった感じ。(なんか解り辛いかも・・・)

ただ単にカラムを追加するだけなら、エディタのマクロとかでも何とかなるけれど、他のテーブルからデータを引っ張ってくるなら、それは無理。そこで、こんな方法をとってみた。

既存DBからデータを取ってくるシェル

psql -U postgres OLD_DB -q -t -A -F ',' -c "SELECT DISTINCT grp.uid, grp.uname, grp.upass, usr.grpid FROM grp, usr WHERE grp.uid = usr.uid" > grp.db.out
psql -U postgres OLD_DB -q -t -A -F ',' -c "SELECT DISTINCT usr.uname, usr.uid, usr.grpid, usr.add, usr.tel FROM usr, grp" > usr.db.out
      :
      :

新規DBに書き込むシェル

psql -U postgres NEW_DB -c "copy grp from '/var/lib/pgsql/grp.db.out' using delimiters ',' with null as ''"
psql -U postgres NEW_DB -c "copy usr from '/var/lib/pgsql/usr.db.out' using delimiters ',' with null as ''"
      :
      :

さて、新しいアプリからDBにアクセスしてみると・・・ちゃんとカラムが追加されていて、データもちゃんと入っているみたい。あっさり終了しました。

このやり方で間違っていないよなぁ・・・データがちゃんと入ってるから、大丈夫なんだよなぁ・・・(←あっさり出来てしまって、かなり不安(笑))

コメント

タイトルとURLをコピーしました