Pythonで取得結果を辞書形式で扱う方法を完全解説!fetchone・fetchallを初心者向けに理解しよう
生徒
「PythonでSQLの検索結果を取得したら、数字の並びになっていて分かりにくいです……」
先生
「それはタプル形式で受け取っているからですね。辞書形式で扱えるようにすると、とても読みやすくなります。」
生徒
「辞書形式って、キーと値で管理するやつですよね?」
先生
「その通りです。fetchoneやfetchallと組み合わせると、SQLの結果が直感的に扱えますよ。」
1. SQLの取得結果はそのままだと分かりにくい
PythonでSQLを実行し、データを取得すると、初期状態ではタプルという形式で返ってきます。タプルは順番で値を管理する仕組みなので、どの値がどの列なのかを覚えておく必要があります。これは、番号だけが書かれた表を見て内容を想像するようなもので、初心者には少し扱いづらい方法です。
2. fetchoneとfetchallの基本的な役割
fetchoneは検索結果から1行だけ取得するメソッドです。一方、fetchallはすべての行をまとめて取得します。どちらもSELECT文の結果を受け取るために使われますが、返ってくるデータの形が同じでも、件数が異なります。用途に応じて使い分けることが大切です。
cursor.execute("SELECT * FROM users")
row = cursor.fetchone()
rows = cursor.fetchall()
3. タプル形式の取得結果の特徴
タプル形式では、row[0]やrow[1]のように番号でデータを取り出します。例えば、名前がどの番号だったかを間違えると、意図しない値を扱ってしまいます。この方法は、列が増えるほどミスが起きやすくなります。
row = cursor.fetchone()
print(row[0])
print(row[1])
4. 辞書形式で扱うメリット
辞書形式で取得結果を扱うと、「列名:値」という形でデータを管理できます。これにより、順番を気にせずにデータを取り出せます。住所録で「名前」「電話番号」と項目名が付いている状態を想像すると分かりやすいでしょう。
5. sqlite3で辞書形式を使う設定方法
Pythonのsqlite3では、row_factoryという設定を使うことで、取得結果を辞書形式にできます。これを設定すると、fetchoneやfetchallの戻り値が、キー付きのデータとして扱えるようになります。
import sqlite3
conn = sqlite3.connect("sample.db")
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
6. fetchoneで辞書形式のデータを取得する
設定後にfetchoneを使うと、1行分のデータを辞書のように扱えます。列名を指定して値を取得できるため、コードの意味が分かりやすくなります。
cursor.execute("SELECT id, name FROM users")
row = cursor.fetchone()
print(row["id"])
print(row["name"])
7. fetchallで複数行を辞書形式で扱う
fetchallを使うと、辞書形式のデータが複数行分まとめて取得できます。それぞれの行は辞書として扱えるため、同じキー名で値を参照できます。複数人の名簿を1枚ずつ確認するイメージです。
cursor.execute("SELECT id, name FROM users")
rows = cursor.fetchall()
for row in rows:
print(row["id"], row["name"])
8. 初心者が覚えておきたい注意点
辞書形式を使うには、必ずrow_factoryの設定を先に行う必要があります。また、キーには列名を正確に指定しなければなりません。スペルミスがあるとエラーになるため、テーブル定義と同じ名前を使う意識が大切です。