【くえりびるだー】

クエリビルダー とは?

最終更新:
💡 SQLの条件を、コードで組み立てる

クエリビルダーは、メソッドなどを使ってSQLを組み立てる仕組み。動的な検索条件を整理でき、値のバインドでSQLインジェクションを防ぐ助けになります。生SQLや列名の扱いには別途注意が必要です。

📌 このページのポイント
クエリビルダー:構造と値を分けるKnex.jsで条件を指定する例knex("users").select("name").where("age", ">", 20)SQLの構造列・テーブル条件値をバインド20入力を生SQLの文字列に結合しない列名・並べ替えは許可した選択肢へ生成SQL・実行計画・アクセス権も確認
コードから組み立てる役割と値の受け渡しを分けた図です。SQLの方言やプレースホルダーはDBにより、クエリビルダーだけでは権限や性能を保証しません。
ひよこ ひよこ
クエリビルダーって何を組み立てるの?
ペンギン先生 ペンギン先生
データベースへの問い合わせ、つまりSQLだよ。例えばKnex.jsではknex("users").select("name").where("age", ">", 20)のように、テーブル、取得列、条件をコードで指定する。生成するSQLの方言や実行方法はライブラリと接続するDBによるね。
ひよこ ひよこ
直接SQLを書いたら危険なの?
ペンギン先生 ペンギン先生
直接書くこと自体が危険なのではなく、入力された値をSQLの文字列に混ぜるのが問題だよ。SQLの構造と値を分け、バインドすることが大切。クエリビルダーの対応するAPIはそれを助けるけれど、生SQLへ入力を文字列結合すると危険は残るんだ。
ひよこ ひよこ
並べ替える列も入力値で渡せる?
ペンギン先生 ペンギン先生
列名やASC・DESCなどは通常の値と同じようにはバインドできないよ。利用者には「名前順」「登録順」など許可した選択肢を示し、コード側で決めた列名へ対応付けよう。引用符で囲めるだけでは、選んでよい列かどうかの確認にはならないんだ。
ひよこ ひよこ
ORMと同じものなの?
ペンギン先生 ペンギン先生
ORMはテーブルとオブジェクトの対応付けなども扱う。クエリビルダーは問い合わせを組み立てる役割だけど、ORMに含まれることもあるよ。抽象度や提供する機能は製品次第なので、どちらなら必ず簡単、と一律には決められないね。
ひよこ ひよこ
どんな場面で使いやすい?
ペンギン先生 ペンギン先生
検索画面で、指定された条件だけwhereを追加するような場面だよ。Knex.jsやLaravelなどに実装例がある。使えるDBや生SQLの扱いを公式資料で確認し、生成されるSQL、結果、実行計画を確かめよう。性能やデータへのアクセス権も別に考える必要があるんだ。
もっと詳しく知りたい人へ

rawやwhereRawを使ってはいけない?

必要な式を記述するための機能ですが、利用者の入力をそのままSQL文字列へ連結しないことが大切です。例えばKnexのrawは値と識別子のプレースホルダーを区別します。適切なバインドを使うとともに、列名や並べ替え方向などは許可した選択肢へ対応付けましょう。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「クエリビルダー」って出てきたら「コードからSQLを組み立てる仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Query Builder」 = クエリ構築器
💬 Query(問い合わせ)を Build(組み立てる)ツールという意味だよ

参考資料

← 用語集にもどる