2007-11-06

rake db:schema:dump してみた

インストール

Fink で rails と activerecord をインストール。してあった。

OSX 10.3 + Fink の Ruby + Fink の PostgreSQL の環境で gem install ruby-postgres はうまくいかない。インストールはできるけどライブラリが入ってない。(もちろん postgresql-dev とか postgresql-shlibs が入ってないとかじゃない。)面倒くさいので

gem install postgres-pr

で回避1

database.yml

  • adapter はあくまで adapter であって module の名前じゃないので postgres ではなく postgresql が正解2
adapter: postgresql
  • host は URI の一部として使われるので、DB サーバの hostname は URI の hostname としての規約に従わなければいけない。
host: HOSTNAME( valid URI ? )

引っ掛かったので適当に CNAME をセットして回避。

rake

rake db_schema_dump

したら今さら何ゆってんのよ、仕方ないわね、と怒られた。正解は

rake db:schema:dump

結果

できあがった schema.rb を見てみたが、やっぱ「データとしては」使いにくいんだなと感じた。

いや何をしてたかというと、定義ファイル(ぶっちゃけちゃうと DDL となる sql)が存在しないデータベースがあるわけです。いやまぁ、作ろうと思えばすぐ作れるわけですけど、管理してないんですな。(要するに手作業で作って使い回し。当然リポジトリには入ってない。)これをメンテするのはまぁいいとします。ただ定義が外部にないので接続しないと中身分かんないわけ。3

だからまずは DDL を生成しようかと思ったんだけど、

pg_dump --schema-only

の出力はあんまり見やすくないなぁとか思い始めちゃって4。rails 入れてあったから database.yml を書いて schema dump だ! と盛り上がったはいいけど、やり慣れない作業で結構時間が掛かってしまったうえに結局「データとしては」再利用しやすいわけじゃないということにやってから気がついた。なんか database.yml みたいなものができるものだと勘違いしていたらしい。(migration 使ったことあるのに!)もちろん見やすさで言えば activerecord の schema dump の方が自動でインデント揃えたりしてくれて見やすいことは見やすい。これはこれで便利。

「データとしての利用」ってのは、例えばデータベースの一覧とかテーブルの一覧なんかを取り出して、それらに対してバッチで何か処理を加える場合を考えているんだけど、とりあえず

psql -c COMMAND

と組み合わせる方向を考えた方がいいかな5

ところで ActiveRecord って Rails の Rakefile がないとやっぱまともに使えないんすかね? 単独で使えたらもっと便利じゃねすか?

  1. Pure Ruby なので速度的には不利だけど、今回は schema dump したいだけなので速度は関係ない。 

  2. 世の中 mysql の話ばかりでいやになっちゃう。 

  3. 本番であろうが開発環境であろうがね。Excel とか Wiki に書き起こすことは当然できるんだけど、それは置いておく。eclipse を常時使ってるなら繋ぎに行って確認してパースペクティブ切り替えればいいだけっちゃいいだけです。えぇ。 

  4. 間延びしてねすか。コメント削れって? 

  5. -t -A -F " " とかしておくと加工しやすい出力を得られる。psql の外に取り出しちゃえばこっちのもの。awk や Ruby が火を噴いちゃうわけ。 

PostgreSQL 8.1 以降は少なくとも psql での管理はやりやすくなってる

気がする。ごめんなさいね、古い話でホントに。(ベンチとか取ってないんでその辺は知りません。)

デフォルト DB が postgres になってるのも role に一本化されているのも、メリットの方が大きい。

例えばデフォルト DB の変更は

psql -U postgres

だけで使い始められるってことを意味する。template1 とか書かなくていいし、template1 を誰かに使われてて作業できませんて可能性も減っていい感じ。template1 は使われてるかもしれないから psql -l でデータベース一覧を取得して適当なやつに繋いで…とか余計なことは全然考えなくていい。

また role は \du だけでこの出力を得られる。

   Role name   | Superuser | Create role | Create DB | Connections | Member of
---------------+-----------+-------------+-----------+-------------+-----------
 postgres      | yes       | yes         | yes       | no limit    |
 web           | no        | no          | no        | no limit    |
 www           | no        | no          | no        | no limit    | {web}

なんだこれとか言っちゃダメ(^^; ただのサンプルだから。これの何がいいって、role の一覧で

  • user
  • group
  • どの user がどの group に属しているのか

全部分かるってこと。しかも ID じゃなくて名前で分かる。スバラシイ。楽ちんじゃないか。これでデータベースの権限管理をまともにやる気になれますよ?

psql -U postgres -t -A -F '|' -c '\du' | awk -F \| '{print $1, $6}'

なんて書くと

postgres
web
www {web}

なんてものが採れます。ふむふむ。(connections の列の中身に空白が入っているのでセパレータをいじってます。この辺はお好きにどうぞ。)

About

例によって個人のなんちゃらです