いま、XoopsCube向けのコードジェネレータを
PHPで作成しています。(間隙を見つけて。)
一番うっとうしいのは、DBテーブルの各フィールドを
意識しなければいけない箇所です。
フレームワークがあっても、DBのフィールドを
まったく意識しないでコーディングすることは
余程ショボいアプリでない限りは、
有り得ないと思います。
現在、ADOdbを使って、DBのメタ情報を取得して
DBの各フィールドに関するコード部分を
ジェネレートするよう開発しているところです。
今回の開発で一番の難所だと思われます。
別に仕事というより、ただの自社開発なので
タイムリミットに追いまくられることがないだけ
気楽ではありますが、いま開発しているものを
今後の開発で大いに活かしていくつもりなので
気が張る開発になっています。
CMSというものをより深く知る機会にもなっていて
大変勉強になっています。
CMSに関連した開発をされている方は、
コードジェネレータを一度作ってみては
いかがでしょうか?
かなり、おススメです。
2009年7月9日木曜日
2009年6月16日火曜日
[PHP]SQL文からテーブル名を取得する
言語は、PHPです。
元ネタは、コチラ。
$tables = array();
if (preg_match_all("/(.*\s+from\s+(\w+(\.\w+)?).*)|(.*\s+join\s+(\w+(\.\w+)?).*)/i", $sqlstr, $matches)) {
foreach($matches as $varry) {
if (is_array($varry)) {
foreach($varry as $v) {
if (!empty($v)
&& !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $v)) {
$tables[] = $v;
}
}
} else {
if (!empty($varry)
&& !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $varry)) {
$tables[] = $varry;
}
}
}
}
正規表現一発でテーブル名を取得しようと思っても、
サブクエリ使ってたりJOIN使ってたりしたら、
なかなか上手くいかないですよね。。。
正規表現一発ではうまくいかなくても
何とか取って来れないかと試行錯誤しました。
なんとか取得できてるっぽいです。
↓こんなSQLでもちゃんとテーブル名だけを返してくれます。
SELECT
a.usage_amount -- test1
,b.charge #test2
,c.* /*
test3
*/
from (
SELECT shop_id, sum(usage_amount) as usage_amount
FROM v0.usagex
GROUP BY (shop_id)
) a
LEFT OUTER JOIN (
SELECT shop_id, sum(charge) as charge
FROM v0.history
GROUP BY (shop_id)
)b on a.shop_id = b.shop_id
INNER JOIN v0.contract c on c.shop_id = a.shop_id
※↑この例の場合、先のコーディングで、$tablesには
・v0.usagex
・v0.history
・v0.contract
が返されます。
元ネタは、コチラ。
$tables = array();
if (preg_match_all("/(.*\s+from\s+(\w+(\.\w+)?).*)|(.*\s+join\s+(\w+(\.\w+)?).*)/i", $sqlstr, $matches)) {
foreach($matches as $varry) {
if (is_array($varry)) {
foreach($varry as $v) {
if (!empty($v)
&& !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $v)) {
$tables[] = $v;
}
}
} else {
if (!empty($varry)
&& !preg_match("/^(\.)|(\s*)(SELECT|JOIN|FROM).*/i", $varry)) {
$tables[] = $varry;
}
}
}
}
正規表現一発でテーブル名を取得しようと思っても、
サブクエリ使ってたりJOIN使ってたりしたら、
なかなか上手くいかないですよね。。。
正規表現一発ではうまくいかなくても
何とか取って来れないかと試行錯誤しました。
なんとか取得できてるっぽいです。
↓こんなSQLでもちゃんとテーブル名だけを返してくれます。
SELECT
a.usage_amount -- test1
,b.charge #test2
,c.* /*
test3
*/
from (
SELECT shop_id, sum(usage_amount) as usage_amount
FROM v0.usagex
GROUP BY (shop_id)
) a
LEFT OUTER JOIN (
SELECT shop_id, sum(charge) as charge
FROM v0.history
GROUP BY (shop_id)
)b on a.shop_id = b.shop_id
INNER JOIN v0.contract c on c.shop_id = a.shop_id
※↑この例の場合、先のコーディングで、$tablesには
・v0.usagex
・v0.history
・v0.contract
が返されます。
2009年5月2日土曜日
フリーのERツール
A5:SQL Mk-2
機能の説明を読んでて、
「ああ、そうそう、こういうのが欲しかった」
と思わずにはいられない、秀逸な仕様の一品。
お一人で開発されてるっぽいけど、
願わくば、ずっとずっとメンテし続けて欲しい。
機能の説明を読んでて、
「ああ、そうそう、こういうのが欲しかった」
と思わずにはいられない、秀逸な仕様の一品。
お一人で開発されてるっぽいけど、
願わくば、ずっとずっとメンテし続けて欲しい。
登録:
投稿 (Atom)