Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのタプルを使ってSQLのIN句クエリを安全に作成する方法

はじめに

Pythonからデータベースへクエリを実行する際、IN句に複数の値を渡したいケースはよくあります。このとき、値を文字列として直接埋め込むとSQLインジェクションなどのセキュリティリスクが生じるため、プレースホルダー(パラメーターマーク)を使用して適切にエスケープされた状態でクエリを実行することが重要です。

本記事では、Pythonのタプルを活用して、安全かつ効率的にIN句付きのSQLクエリを組み立てる方法を解説します。

基本的な実装方法

ポイントは、タプルの要素数に合わせてプレースホルダー「?」を自動的に生成することです。以下のコードでは、タプルの長さに応じてカンマ区切りのプレースホルダー文字列を動的に作成しています。

my_tuple = ("Hello", "world", "John")
placeholder = '?'
placeholders = ', '.join(placeholder for _ in my_tuple)
query = 'SELECT name FROM students WHERE id IN (%s)' % placeholders
print(query)

このコードでは、リスト内包表記(ジェネレータ式)を使ってタプルの要素数と同じ個数の ? を生成し、join() でカンマ区切りの文字列に変換しています。

実行結果

上記のコードを実行すると、次のようなクエリ文字列が生成されます。

'SELECT name FROM students WHERE id IN (?, ?, ?)'

生成されたクエリには、タプルの要素数(この場合は3つ)に対応した3つのプレースホルダーが含まれていることがわかります。

クエリの実行

続いて、カーソルの execute() メソッドを使って、生成したクエリとタプルを渡します。

# カーソルを使ってクエリを実行
cursor.execute(query, my_tuple)

execute() を呼び出すと、ドライバー側が自動的に各 ? プレースホルダーをタプル内の値で正しく置き換え、適切にエスケープ処理を行ってくれます。

この方法のメリット

  • SQLインジェクション対策: 値が直接文字列連結されないため、悪意ある入力による攻撃を防げます。
  • 可読性の向上: クエリとデータが分離され、コードが整理されます。
  • 柔軟性: タプルの要素数が変わっても、プレースホルダーが自動的に調整されるため、コードの修正が不要になります。

まとめ

Pythonのタプルとプレースホルダーを組み合わせれば、要素数に応じたIN句クエリを安全かつ簡単に構築できます。join() でプレースホルダーを動的生成し、execute() の第2引数にタプルを渡すだけで、エスケープ処理も自動的に行われるため、ぜひ日々の開発で活用してください。

  1. Pythonでタプルの中にタプルを入れる方法(ネストされたタプルの使い方)

    Pythonにおけるタプルは、丸括弧 () で囲まれた、順序を持つオブジェクトのコレクションとして定義されます。タプルの要素には任意のPythonオブジェクトを格納できるため、タプル自体を別のタプルの要素として含めることも可能です。これを「ネストされたタプル」と呼びます。タプルの中にタプルを定義する以下の例では、タプル t1 の中に、別のタプル (4, 5, 6) を要素として含めています。>>> t1 = (1, (4, 5, 6), 2, 3) >>> t1 (1, (4, 5, 6), 2, 3)インデックスで内側のタプルを取り出すこの例では、t1 の

  2. Python関数からタプルを返す方法をわかりやすく解説

    Pythonでは、関数から複数の値を一度に返したい場合にタプルを活用できます。タプルを使えば、文字列や数値など異なる型の値をまとめて1つの戻り値として扱えるため、非常に便利です。ここでは、実際にタプルを返す関数を定義し、その動作を確認してみましょう。コード例def foo(): str = tutorialspoint x = 30 return (str, x) print(foo())この関数 foo() は、文字列 tutorialspoint と整数 30 を括弧で囲んでタプルとして返しています。呼び出し側では、このタプルを受け取ってそのまま表示できます。実行