ちょっと間が開いてしまいました。
独自フレームワークCollabo-Xの機能を紹介する第5弾です。
今回はデータベースのアクセス方法について。
この辺は結構いろんな方法があちこちで検討されていて、
それほど独自色を出しているわけではありませんが、
結構お手軽な方法にはなっています。
6.Smartyテンプレートによる動的SQL
動的SQLの出力処理と言うのは結構いつも問題になる箇所です。
ライトウェイト言語のユーザだと、未だに条件分岐でSQL文を結合して出力するパターンを見かけます。
これは、かなり面倒でかつバグが潜みやすい箇所です。
PHPでもいろんなデータベースアクセスの方法が提供されてますが、
Collabo-Xではまず、土台として、Smartyを使って動的SQLを出力することを考えました。
Smartyは本来動的なHTMLをはくためのものですが、
HTMLであろうとSQLであろうと、所詮テキストであることには代わりません。
そして、両方ともある程度構造的なテキストです。
出力する処理には似たような用件が求められることが多いのです。
よく似た形で動的SQLを出力するものとしては、
Seaser2のS2DAOがコメントとして、ifやforeach、変数の埋め込みする機能を持っています。
PHPでやる場合はSmartyがほぼデファクトスタンダードのテンプレートマネージャで、
PHPプログラマならSmartyタグを理解している人が多いので、
SQLについてもSmartyを使うのがいいだろうと考えました。
これを使うとこんなことが出来るようになります。
SELECT * FROM {$table} WHERE TRUE AND {foeach from=$where key=vname item=value}'{$vname}'={$value}{/foreach}
これで、「どれかのテーブルに対してANDで結合した条件で検索する」ための汎用的なSQLテンプレートになります。
もっと複雑な、例えば副問合せなどを含む複雑なSQLであっても、Smartyタグを使うことにより、
比較的簡単に書くことが出来るようになっています。
また、Smartyではユーザ定義タグや修飾子を作成することができるので、
それを利用して、SQLテンプレートをより書きやすくすることができます。
集計関数や日付の計算関数など、使うとわかりづらくなりがちな関数の呼び出しなどを、
ユーザ定義タグとして定義することで、テンプレート自体をわかりやすくすることが可能です。
7.標準的なDBアクセス
Smartyタグを使って動的SQLのテンプレートを作っていくと、
アプリケーション開発の中ではよく似た記述のSQLがほとんどを占めることに気付きます。
例えば、DELETEとINSERTについては、ほとんどがテーブルごとに一つずつ、
決まった形の動的SQLを用意しておくだけで間に合います。
UPDATEやSELECTについても、多くは標準的な形と言うのを定義できそうです。
そこで、標準的なSELECT、DELETE、INSERT、UPDATEのSQLを策定し、
標準DAOとして利用することにしました。
これらは対象のテーブル名もSmarty変数として呼び出し時に引き渡す形になります。
標準形では収まりきらないような複雑なSQLが必要とならない限り、
ほとんどSQLを書かずに開発を進めていけるようになっています。
実際、ある程度の規模のポータルサイトの開発を行った際には、
9割程度は標準DAOだけでデータアクセスができました。
複雑なものだけ、開発時にSQLテンプレートを書き出せばいいのです。
業務システムの場合は、どうしても標準に収まりきらないSQLが出てきますが、
それでも、7割~8割程度、SQLを書き出す作業を削減できます。
独自フレームワークCollabo-Xの機能を紹介する第5弾です。
今回はデータベースのアクセス方法について。
この辺は結構いろんな方法があちこちで検討されていて、
それほど独自色を出しているわけではありませんが、
結構お手軽な方法にはなっています。
6.Smartyテンプレートによる動的SQL
動的SQLの出力処理と言うのは結構いつも問題になる箇所です。
ライトウェイト言語のユーザだと、未だに条件分岐でSQL文を結合して出力するパターンを見かけます。
これは、かなり面倒でかつバグが潜みやすい箇所です。
PHPでもいろんなデータベースアクセスの方法が提供されてますが、
Collabo-Xではまず、土台として、Smartyを使って動的SQLを出力することを考えました。
Smartyは本来動的なHTMLをはくためのものですが、
HTMLであろうとSQLであろうと、所詮テキストであることには代わりません。
そして、両方ともある程度構造的なテキストです。
出力する処理には似たような用件が求められることが多いのです。
よく似た形で動的SQLを出力するものとしては、
Seaser2のS2DAOがコメントとして、ifやforeach、変数の埋め込みする機能を持っています。
PHPでやる場合はSmartyがほぼデファクトスタンダードのテンプレートマネージャで、
PHPプログラマならSmartyタグを理解している人が多いので、
SQLについてもSmartyを使うのがいいだろうと考えました。
これを使うとこんなことが出来るようになります。
SELECT * FROM {$table} WHERE TRUE AND {foeach from=$where key=vname item=value}'{$vname}'={$value}{/foreach}
これで、「どれかのテーブルに対してANDで結合した条件で検索する」ための汎用的なSQLテンプレートになります。
もっと複雑な、例えば副問合せなどを含む複雑なSQLであっても、Smartyタグを使うことにより、
比較的簡単に書くことが出来るようになっています。
また、Smartyではユーザ定義タグや修飾子を作成することができるので、
それを利用して、SQLテンプレートをより書きやすくすることができます。
集計関数や日付の計算関数など、使うとわかりづらくなりがちな関数の呼び出しなどを、
ユーザ定義タグとして定義することで、テンプレート自体をわかりやすくすることが可能です。
7.標準的なDBアクセス
Smartyタグを使って動的SQLのテンプレートを作っていくと、
アプリケーション開発の中ではよく似た記述のSQLがほとんどを占めることに気付きます。
例えば、DELETEとINSERTについては、ほとんどがテーブルごとに一つずつ、
決まった形の動的SQLを用意しておくだけで間に合います。
UPDATEやSELECTについても、多くは標準的な形と言うのを定義できそうです。
そこで、標準的なSELECT、DELETE、INSERT、UPDATEのSQLを策定し、
標準DAOとして利用することにしました。
これらは対象のテーブル名もSmarty変数として呼び出し時に引き渡す形になります。
標準形では収まりきらないような複雑なSQLが必要とならない限り、
ほとんどSQLを書かずに開発を進めていけるようになっています。
実際、ある程度の規模のポータルサイトの開発を行った際には、
9割程度は標準DAOだけでデータアクセスができました。
複雑なものだけ、開発時にSQLテンプレートを書き出せばいいのです。
業務システムの場合は、どうしても標準に収まりきらないSQLが出てきますが、
それでも、7割~8割程度、SQLを書き出す作業を削減できます。