DB Designer4からPropelのスキーマを作成

ウェブアプリケーションのDB設計を行うときに、何かツールを使っていますか?
私はDB Designerというツールを使うことが多いです。
このツールについてはDBDesigner 4 日本語化サイトで詳しく解説されていますし、日本語化のパッケージも配布されていますので必見です。


そして、CakePHPで、このDB Designerと連携するdbdesigner2cakeが紹介されていました。
DB DesignerとCakePHPの連携「dbdesigner2cake」
MySQLを使うのであれば確実に利用すべきではないかと思えるほどです。

では、同じようなことがsymfonyではできないのかというと、DB Designerで作成されたデータXMLからPropelのスキーマ(schema.xml)へ変換してくれるツールが公開されています。
DB Designer 4 TO Propel Schema Converter

このツールを利用すればsymfonyでもDB Designerを最大限に利用することができます。
しかし、上記ツールだと少々融通が利かないところがあります。
たとえば、packageを指定したかったり、テーブルのphpNameを指定したい場合は変換後に修正する必要があったり、日本語のコメントが正しく表示されないので削除したりと。。。

できるものなら、変換したXMLに手を加えなくて済むようにしたいなぁ。。

というわけで、上記サイトを参考に手を加えてみました。
DB DesignerからPropelのschema.xmlを作成

  • packageの指定がデータベースのCommentsで行える
  • phpNameの指定がテーブルのCommentsで行える
  • カラムのコメントは変換しない


はじめてxslを触りましたが、すごいですねぇ。。

便利なAPIドキュメント検索

フレームワークを利用する上で面倒なのが、メソッド名を忘れたりした場合です。
symfonyなどでは本家にAPIドキュメントが用意されていますが使い勝手は良いとはいえません。
しかし、なんとも使い勝手の良いAPIドキュメント検索サイトがありました。
http://www.gotapi.com/

symfony以外にもcakePHP、さらにはrubypythonの言語、MySQLなどのデータベースまで色々なAPIのドキュメントが利用できるようになっています。
しかも、widgetも用意されており、こちらもインクリメンタルサーチできるため、メソッド名の一部を覚えていればOKです。


http://www.gotapi.com/widgets/compiled/c1_module_symfony.html

というわけで、http://develop.ddo.jp/new-tech/に設置してみました。
作業効率も上がりそうです。

cakephpではデータベース接続定義を各アプリケーションのconfig/database.phpで設定しますが、
postgresでpg_pconnect(持続接続)ではなくpg_connectを使いたい場合は

var $default = array('driver'   => 'postgres',
                     'connect'  => 'pg_connect',
                     'host'     => 'localhost',
                     'login'    => 'user',
                     'password' => 'password',
                     'database' => 'project_name',
                     'prefix'   => '');

と、connect部分を指定してあべればよい。。。っぽい。
ソースを追ってみると、内部では指定されたconnectの関数をそのまま呼んでいるから。

確かに、変更し、接続プロセスを次のようにして見てみると

 $ps ax | grep postgres

pg_pconnectのときに貼りっぱなしだったのがpg_connectでは残っていません。
ふぬ。disconnectもちゃんとてくれてるってことかな。

cakeではモデルがテーブルのカラム定義を動的に取得しますが、
アクセスのたびにテーブル構造を取得するのはナンセンスということで
テーブル構造をキャッシュする仕組みになっています。

これはこれでいいんですが、いったんリリースした(DEBUG = 0)アプリケーションで
後からテーブル構造だけ変更すると、反映されないことがあります。

ちなみにキャッシュされる期間は

  • DEBUG > 0 => 15秒
  • DEBUG = 0 => 999日

となってます。

というわけで、キャッシュを消せばよいのですが、
キャッシュの場所は

 <アプリ名> /tmp/cache/models/

に各モデル毎にあります。

これに気づかずにはまった。。