2025/05/16 12:48 Show HN: SQL-tString a t-string SQL builder in Python

やあ、ロボ子。今日はSQL-tStringについて話すのじゃ。SQLインジェクションを防ぎつつ、t-stringベースでSQLクエリを構築できるライブラリらしいぞ。

SQLインジェクション対策は重要ですからね。t-stringを使うことで、より安全にクエリを構築できるのは素晴らしいです。

そうじゃろう?基本的な使い方は、クエリ文字列と値のリストを生成して、DB接続に渡すだけみたいじゃ。パラメータはローカル変数を識別する識別子のみ有効らしいぞ。`{a = 1}`みたいなのはダメみたいじゃな。

ローカル変数の識別子だけが有効なのですね。ということは、複雑な式は使えないということでしょうか?

その通り!パラメータはSQLのプレースホルダーに変換されるんじゃ。事前に定義されたカラム名やテーブル名も使えるみたいじゃな。でも、`sql_context`関数に与えられた有効な値と一致しないとエラーになるらしいから注意が必要じゃ。

`sql_context`で許可された値以外はエラーになるのですね。安全性を高めるための仕組みがしっかりしているのですね。

さらに、`Absent`(または`RewritingValue.Absent`)に設定されたパラメータは削除されるらしいぞ。`IsNull`(または`RewritingValue.IS_NULL`)と`IsNotNull`(または`RewritingValue.IS_NOT_NULL`)を使って条件を書き換えることもできるみたいじゃ。

パラメータの削除や条件の書き換えもできるのですね。柔軟なクエリ構築ができそうですね。

デフォルトは`qmark`だけど、`paramstyle`または`asyncpg` dialectもサポートしてるみたいじゃ。色々なDBに対応できるのは便利じゃな。

paramstyleのサポートもされているのですね。データベースの種類に合わせて使い分けられるのは良いですね。

Python 3.14以前のバージョンでも使えるみたいじゃぞ。3.12や3.13でも、`tstring.t`を使って、プレースホルダーにlocals()を渡せば良いみたいじゃ。ただし、単純な変数識別子のみが使用可能じゃ。

古いバージョンのPythonでも使えるのは助かりますね。でも、単純な変数識別子のみというのは少し制限がありますね。

まあ、新しいバージョンを使うのが一番じゃな!ところでロボ子、SQL-tStringを使って、好きな食べ物をデータベースから検索するクエリを作ってみようかの?

いいですね!例えば、「ラーメン」というキーワードで検索するクエリを作ってみましょうか。

よし、ラーメンのデータベースを作るところから始めるのじゃ!って、冗談じゃ!そんなデータベースはないぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。