👌

Nodejsで2Way-SQLの自作ライブラリを試してみた

2024/07/03に公開

1. 2Way-SQLとは

2Way-SQLは、動的なSQLを生成するためのテンプレート言語です。通常のSQLに特殊なコメントを追加することで、条件に応じてSQLの一部を変更したり、パラメータを動的に設定したりすることができます。これにより、開発者はJavaなどのプログラミング言語でSQLを組み立てる複雑さを避けつつ、柔軟なSQLクエリを作成できます。

2. 内容

このプロジェクトでは、自作したSQLQueryBuilderクラスを使用して、2Way-SQLテンプレートからSQLとパラメーターを生成しています。主な特徴は以下の通りです:

  • SQLQueryBuilderクラスが2Way-SQLテンプレートを解析し、動的なSQLを生成します。
  • 生成されたSQLは、PreparedStatementで使用することを想定しています。
  • SQLQueryBuilderは、SQLだけでなく、対応するパラメーター値も生成します。

例として、以下のようにPreparedStatementを使用することができます:

const preparedStatementInfo = this.pool!.prepare({
    sql: sqlquery.sql,
    values: sqlquery.getValues()
});

この方法により、SQLインジェクション攻撃のリスクを軽減し、より安全なデータベースアクセスを実現できます。

3. ソース

import {SQLQueryBuilder} from "./sqlquery/SQLQueryBuilder";
const template: string = `
SELECT
    *
FROM
    BOOK
/*BEGIN*/
WHERE
    /*IF author == null */
    AUTHOR = /*author.name*/'Naoki Takezoe'
    /*END*/
    /*IF minPrice != null */
    AND PRICE >= /*minPrice*/20
    /*END*/
    /*IF maxPrice != null */
    AND 
        PRICE <= /*maxPrice*/100
    /*END*/
/*END*/
ORDER BY
    BOOK_ID ASC`;
const context = {
    author: {name: "Author's Name"},
    minPrice: 10,
    maxPrice: 50
};
const sqlQueryBuilder = new SQLQueryBuilder();
const sqlquery = sqlQueryBuilder.build(template, context);
console.log(sqlquery.sql);
console.log(sqlquery.getValues());

4. 結果

提供されたソースコードを実行した結果、以下の出力が得られました:

  • 生成されたSQL:
SELECT
    *
FROM
    BOOK
WHERE
    AUTHOR = ?
    AND PRICE >= ?
    AND 
        PRICE <= ?
ORDER BY
    BOOK_ID ASC
  • 生成されたパラメーター:
[ "Author's Name", 10, 50 ]

これらの結果から、以下のことが分かります:

  1. テンプレート内の条件(IF文)が正しく評価され、適切なWHERE句が生成されています。
  2. プレースホルダー(?)が使用され、SQLインジェクションを防ぐ準備ができています。
  3. パラメーター値が正しく抽出され、順序付けられています。

5.まとめ

この2Way-SQLとSQLQueryBuilderの組み合わせは、以下のような利点を提供します:

  1. 柔軟性: 動的なSQLを簡単に作成できるため、複雑な条件分岐を含むクエリも容易に実装できます。
  2. 可読性: SQLの構造がテンプレート内で明確に表現されているため、開発者がクエリの意図を理解しやすくなります。
  3. セキュリティ: PreparedStatementと組み合わせることで、SQLインジェクション攻撃のリスクを大幅に低減できます。
  4. 保守性: SQLロジックとアプリケーションロジックを分離することができ、それぞれを独立して管理・更新できます。
  5. 効率性: 動的なSQL生成をテンプレートベースで行うことで、手動でのSQL文字列操作に比べてエラーが少なく、開発効率が向上します。

この実装により、データベースアクセスのコードがよりクリーンで安全になり、開発者の生産性向上にも貢献すると考えられます。今後の改善点としては、より複雑なSQLテンプレートのサポートや、パフォーマンス最適化などが考えられるでしょう。

Discussion