カテゴリ: Python 更新日: 2026/03/03

PythonでSQLのプレースホルダーを使ったパラメータ化クエリを完全解説!初心者でも安全にデータベース操作

PythonでSQLのプレースホルダーを使ったパラメータ化クエリ
PythonでSQLのプレースホルダーを使ったパラメータ化クエリ

先生と生徒の会話形式で理解しよう

生徒

「PythonでSQLを使うとき、文字をつなげてSQL文を作っても大丈夫なんですか?」

先生

「見た目は動きますが、とても危険です。そこで使うのがプレースホルダーを使ったパラメータ化クエリです。」

生徒

「プレースホルダーって何ですか?難しそうです……」

先生

「大丈夫です。空欄を用意して、あとから安全に値を入れる仕組みだと思ってください。」

1. PythonでSQLを使うとは?

1. PythonでSQLを使うとは?
1. PythonでSQLを使うとは?

Pythonでは、データベースと呼ばれる「大量のデータを整理して保存する箱」を操作できます。SQLは、その箱に対して「データを入れて」「取り出して」「更新して」とお願いするための言葉です。PythonにはSQLiteなどのデータベースを簡単に操作できる仕組みが用意されており、アプリ開発や業務システムでよく使われます。

2. 文字列連結でSQLを書く危険性

2. 文字列連結でSQLを書く危険性
2. 文字列連結でSQLを書く危険性

初心者の方が最初にやりがちなのが、SQL文を文字列としてつなげる方法です。一見すると簡単ですが、入力内容によっては意図しないSQLが実行されてしまう可能性があります。これをSQLインジェクションと呼び、データが盗まれたり消されたりする原因になります。


user_id = "1"
sql = "SELECT * FROM users WHERE id = " + user_id

3. プレースホルダーとは何か

3. プレースホルダーとは何か
3. プレースホルダーとは何か

プレースホルダーとは、SQL文の中に用意する「あとで値を入れるための空欄」です。Pythonでは「?」を使うのが一般的です。先にSQLの形だけ決めておき、実際の値は別で渡します。これにより、危険な文字が自動的に処理され、安全に実行されます。

4. SQLiteでの基本的な使い方

4. SQLiteでの基本的な使い方
4. SQLiteでの基本的な使い方

ここではPython標準のsqlite3を使った例を見てみましょう。データベースに接続し、プレースホルダー付きのSQLを実行します。


import sqlite3

conn = sqlite3.connect("sample.db")
cursor = conn.cursor()

user_id = 1
cursor.execute(
    "SELECT * FROM users WHERE id = ?",
    (user_id,)
)

rows = cursor.fetchall()

5. なぜ安全になるのか

5. なぜ安全になるのか
5. なぜ安全になるのか

プレースホルダーを使うと、SQL文と値が完全に分離されます。たとえ値の中にSQLの命令っぽい文字が入っていても、ただのデータとして扱われます。包丁を直接渡すのではなく、ケースに入れて渡すようなイメージです。

6. INSERT文でのプレースホルダー

6. INSERT文でのプレースホルダー
6. INSERT文でのプレースホルダー

データを追加する場合も考え方は同じです。名前や年齢を安全にデータベースへ保存できます。


name = "山田"
age = 20

cursor.execute(
    "INSERT INTO users (name, age) VALUES (?, ?)",
    (name, age)
)
conn.commit()

7. UPDATE文での使い方

7. UPDATE文での使い方
7. UPDATE文での使い方

更新処理でもプレースホルダーを使います。どの行を更新するか、どんな値にするかを安全に指定できます。


new_age = 21
user_id = 1

cursor.execute(
    "UPDATE users SET age = ? WHERE id = ?",
    (new_age, user_id)
)
conn.commit()

8. よくある間違いと注意点

8. よくある間違いと注意点
8. よくある間違いと注意点

値を一つだけ渡す場合でも、タプルとして指定する必要があります。末尾のカンマを忘れるとエラーになるため注意しましょう。また、プレースホルダーの数と値の数は必ず一致させてください。


cursor.execute(
    "SELECT * FROM users WHERE name = ?",
    ("山田",)
)
カテゴリの一覧へ
新着記事
New1
Flask
Flaskのアプリケーションファクトリパターンをやさしく解説!初心者でもわかる理由とメリット
New2
Flask
FlaskアプリのSECRET_KEYの設定方法を完全ガイド!初心者でもわかるセキュリティ対策
New3
Django
Djangoでできることとは?初心者でもわかるDjangoの特徴と向いているプロジェクト
New4
Flask
Flaskとクラウド連携を最適化!初心者でもできるWebアプリ運用のベストプラクティス
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonのコメント活用術!初心者向けにTODO・FIXME・ドキュメンテーションコメントの書き方を完全解説
No.2
Java&Spring記事人気No2
Python
Pythonのbytes型とbytearray型とは?初心者向けにバイナリデータの扱い方を解説!
No.3
Java&Spring記事人気No3
Python
Pythonで仮想環境(venv)を作る方法!初心者向けに環境構築をステップ解説
No.4
Java&Spring記事人気No4
Python
Pythonで空白や不要な文字を削除する方法!strip(), rstrip(), lstrip() の使い方を初心者向けに解説
No.5
Java&Spring記事人気No5
Flask
Flaskで非同期処理が必要になる場面とは?初心者でもわかる非同期処理とタスク管理の考え方
No.6
Java&Spring記事人気No6
Flask
Flaskアプリの環境変数をクラウドで安全に設定する方法!初心者のための完全ガイド
No.7
Java&Spring記事人気No7
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.8
Java&Spring記事人気No8
Flask
Flaskでデータベースを使う基本!SQLAlchemyの導入方法をやさしく解説