開発部

フレームワーク機能「クエリービルダー」の罠

開発のオジサン🧔エンジニアDJです。

今回はフレームワークに内蔵されているクエリービルダーのお話です。

引用です👇
5.2 クエリー・ビルダーの使用
https://docs.oracle.com/cd/F39413_01/aeutl/using-query-builder.html
クエリー・ビルダーを使用すると、SQLの知識がほとんどなくても、データベース・オブジェクトの検索およびフィルタ適用、オブジェクトおよび列の選択、オブジェクト間の関係の作成、問合せ結果の書式の表示、問合せの保存を行うことができます。
引用です👆

単純なSQLではクエリービルダーで十分なのですが、複雑になってくるといろいろと問題が出てきます。

1.(X=a OR X=b) AND (Y=c OR Y=d)👈コレ(ANDとORの混在した優先順位)どうすんの?括弧付けてないと「X=a OR X=b AND Y=c OR Y=d」はANDが優先されて「X=a OR (X=b AND Y=c) OR Y=d」となってしまいます。

2.ネスティングが深くなるサブクエリーはどうすんの?👈服問い合わせ部分に直接SQLを書くのではクエリービルダー使う意味が無い。

3.相関サブクエリーどうすんの?👈2と同様に直にSQLを書くのではクエリービルダーを使う意味が無い。

おそらく書けるとは思いますが、これらはもうワンステップSQLを学習してSQL文を直書きした方が分かりやすいケースの方が多いです。

フレームワークが変わるとそれまでのクエリービルダーとは違うモノを使用する事になります。cakephpのクエリービルダーとcodeigniterのクエリービルダーは全く別ですし、同じフレームワークでもバージョン変わると記述方式が変更になります。その結果、フレームワークを変更する時に書き換えが必要になります。書き換えるときのデバッグ量も連動して増えていきます。

常に思うのは、直に書いたSQLの方が問題点も突き止めやすいです。

ではクエリービルダーが使われているときワタシはどうやって調査するかと言うと…、クエリービルダーから生成されたSQL文を見ています。コレを確認するためのツールが有れば簡単なのですが、無い時はフレームワークの根幹部分を調べてプリント文にて表示します。クエリービルダーでどう書かれてるかではなく、どのように生成されたかが重要なのです。

①直接SQL文を書いてデバッグして、②クエリービルダー用に書き直して、④実行する時にどのように生成されるかチェックして、④①で作ったSQL文どおりに生成されているかを確認する。無駄な工程にしか思えない…。(「SQLの知識がほとんどなくても」に該当する人でなければ…)

文:開発部DJ