(1時間4,000円の伴走型ビデオチャット指導も受付中!)
Pythonでデータベースを操作する:初心者でも基礎から学べるデータの保存と管理
![]()
【Hiroki】
Yukiさん、こんにちは。最近Pythonの学習を進めているのですが、少し困っていることがあるんです。
プログラムで作ったデータを保存したいとき、今はテキストファイルに書き込んでいるのですが、データの数が増えてくると管理がとても大変になってしまって……。
もっと効率的にデータを扱う方法はないでしょうか?
![]()
【Yuki】
Hirokiくん、こんにちは。
そうですね……テキストファイルでの管理は、データの検索や更新が増えてくると、どうしても限界が来てしまうかもしれません。
そんな時は「データベース」という仕組みを使うのが、一番良い解決策だと思います。
データベースは、たくさんのデータを整理して保存し、必要な時にすぐ取り出せるように設計された、情報の「倉庫」のようなものです。
今日は、Pythonからこのデータベースを操作する方法について、一緒に学んでいきましょう。
データベースとは何かを理解する
![]()
【Hiroki】
データベース、名前は聞いたことがあります!
でも、具体的にどういうものなのか、Excelのような表形式のデータとは何が違うのでしょうか?
![]()
【Yuki】
良い質問ですね……。
私たちがよく使うのは「関係データベース(RDBMS)」と呼ばれるもので、Hirokiくんが言う通り、基本的には「テーブル」という表の形式でデータを管理します。
Excelと違う点は、大量のデータを高速に検索できたり、複数のユーザーが同時にアクセスしてもデータが壊れないように保護されていたり、データ同士の複雑な繋がりを定義できたりする点です。
Pythonには、標準で「SQLite」というデータベースエンジンが組み込まれているので、新しくサーバーを立てたりしなくても、すぐに使い始めることができるんですよ。
![]()
【Hiroki】
Pythonをインストールしただけで、もうデータベースが使える状態なんですね。
それは初心者にとって、すごく心強いです。
![]()
【Yuki】
ええ、そう思います。
SQLiteは、一つのファイルにすべてのデータが保存される仕組みなので、扱いがとても簡単なんです。
誰かの役に立つために作られた、小さくて便利な道具のような存在ですね……。
そんな風に、目立たないけれど誰かを支える仕組みを知ることは、プログラミングを学ぶ上でとても大切だとわたしは思います。
SQLiteを使ってデータベースに接続する
![]()
【Yuki】
それでは、まずはPythonでSQLiteを使うための準備をしましょう。
標準ライブラリの sqlite3 モジュールをインポートするだけで始められます。
import sqlite3
# データベースファイルに接続する
# ファイルが存在しない場合は、新しく作成されます
conn = sqlite3.connect('my_database.db')
# 操作を行うための「カーソル」を作成する
cursor = conn.cursor()
print("データベースに接続しました")
# 最後に接続を閉じる
conn.close()
![]()
【Hiroki】
「接続」と「カーソル」という言葉が出てきましたね。これはどういう役割なんですか?
![]()
【Yuki】
「接続(Connection)」は、データベースという倉庫への扉を開けて、道を作るイメージです。
そして「カーソル(Cursor)」は、その倉庫の中で実際に作業を行う「作業員さん」のような役割だと思ってください。
SQLという命令をデータベースに届けて、結果を持ってきてもらうのは、このカーソルの仕事になります。
テーブルを作成してデータを定義する
![]()
【Hiroki】
まずは、データを入れる「箱」が必要ですよね。
![]()
【Yuki】
はい。データベースの中に、どのような形式でデータを保存するかを決める「テーブル」を作成する必要があります。
ここでは例として、ユーザーの情報を保存するテーブルを作ってみましょう。
SQLという専用の言語を使って命令を出します。
import sqlite3
conn = sqlite3.connect('my_database.db')
cursor = conn.cursor()
# usersテーブルを作成するSQL
# id: 整数(主キー), name: テキスト, age: 整数
create_table_sql = '''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
)
'''
# SQLを実行する
cursor.execute(create_table_sql)
# 変更を保存(コミット)する
conn.commit()
print("テーブルを作成しました")
conn.close()
![]()
【Hiroki】
CREATE TABLE IF NOT EXISTS というのは、「もしテーブルがなかったら作る」という意味ですか?
![]()
【Yuki】
その通りです。これをつけておけば、二回目以降の実行で「もうテーブルがあるよ」というエラーが出るのを防げます。
それから、最後に conn.commit() を呼んでいるのがポイントです。
データベースへの変更は、この「コミット」という作業をしない限り、確定されません。
間違えてデータを消してしまっても、コミット前なら取り消せるという、安全のための仕組みなんです。
データの挿入(Create)とプレースホルダの重要性
![]()
【Hiroki】
箱ができたので、次はデータを入れてみたいです!
![]()
【Yuki】
では、新しいユーザーを追加してみましょう。
ここでとても大切なのが「プレースホルダ」という仕組みを使うことです。
import sqlite3
conn = sqlite3.connect('my_database.db')
cursor = conn.cursor()
# 挿入したいデータ
user_name = "Hiroki"
user_age = 17
# データを挿入するSQL(? はプレースホルダ)
insert_sql = 'INSERT INTO users (name, age) VALUES (?, ?)'
# 第二引数にタプル形式でデータを渡す
cursor.execute(insert_sql, (user_name, user_age))
conn.commit()
print(f"{user_name}くんのデータを登録しました")
conn.close()
![]()
【Hiroki】
SQLの中に直接変数を書かずに、? を使っていますね。これはどうしてですか?
![]()
【Yuki】
それは、セキュリティを守るためなんです。
もし ? を使わず、文字列の結合などでSQLを作ってしまうと、「SQLインジェクション」という攻撃を受ける隙が生まれてしまいます。
悪意のある入力によって、データベースのデータがすべて盗まれたり、消されたりする恐れがあるんです。
? を使えば、Pythonのライブラリが安全に値を処理してくれるので、初心者の方こそ、最初からこの書き方を癖にしておくと良いと思います……。
データの取得(Read)
![]()
【Hiroki】
データを入れることができました。今度は、保存したデータを取り出してみる方法を知りたいです。
![]()
【Yuki】
データを取り出すには SELECT 命令を使います。
cursor.execute() でSQLを実行した後、結果を取得するメソッドを呼び出します。
import sqlite3
conn = sqlite3.connect('my_database.db')
cursor = conn.cursor()
# すべてのユーザーを取得する
cursor.execute('SELECT * FROM users')
# すべての結果をリストとして取得する
rows = cursor.fetchall()
for row in rows:
# rowはタプル形式で返ってくる(id, name, age)
print(f"ID: {row[0]}, 名前: {row[1]}, 年齢: {row[2]}")
conn.close()
![]()
【Hiroki】
fetchall() を使うと、すべての行が一度に取れるんですね。
でも、もしデータが100万件あったら、全部一度に取るのは大変じゃないですか?
![]()
【Yuki】
鋭いですね……その通りです。
大量のデータがある場合は、fetchone() を使って一行ずつ取り出すか、LIMIT 句をSQLに付け加えて、取得する件数を制限するのが一般的です。
必要な時に、必要な分だけを取り出す。それがデータベースを賢く使うコツかもしれません。
データの更新(Update)と削除(Delete)
![]()
【Hiroki】
データの修正や削除も、同じような流れでできるのでしょうか?
![]()
【Yuki】
はい、基本は同じです。
UPDATE でデータの書き換え、DELETE でデータの削除を行います。
ここでも、どのデータを対象にするかを指定する WHERE 句がとても重要になります。
import sqlite3
conn = sqlite3.connect('my_database.db')
cursor = conn.cursor()
# IDが1のユーザーの年齢を18歳に更新する
new_age = 18
target_id = 1
cursor.execute('UPDATE users SET age = ? WHERE id = ?', (new_age, target_id))
# 名前が "Test" のユーザーを削除する
target_name = "Test"
cursor.execute('DELETE FROM users WHERE name = ?', (target_name,))
conn.commit()
conn.close()
![]()
【Hiroki】
もし WHERE を書き忘れたら……どうなるんでしょう?
![]()
【Yuki】
……想像するだけで少し怖いですが、テーブルにあるすべてのデータが更新されたり、消えたりしてしまいます。
操作を実行する前には、対象が正しいか、一呼吸置いて確認するのが大切ですね。
私は心配性なので、いつも何度も見直してしまいます。
より高度な操作:ORM(SQLAlchemy)について
![]()
【Hiroki】
SQLという言葉を覚えるのは少し大変ですが、プログラムっぽくて面白いですね。
でも、もっとPythonのコードだけで直感的に操作する方法はないのでしょうか?
![]()
【Yuki】
ありますよ。それは「ORM(Object-Relational Mapping)」という仕組みを使う方法です。
有名なものに「SQLAlchemy」というライブラリがあります。
これを使うと、データベースのテーブルをPythonの「クラス」として扱えるようになります。
![]()
【Hiroki】
クラスとして扱える……ということは、SQLを直接書かなくてもいいんですか?
![]()
【Yuki】
ええ。例えば、データを追加するのも session.add(user_object) のように書けます。
SQLに慣れないうちは難しく感じるかもしれませんが、規模の大きな開発では、プログラムの保守性が高まるのでよく使われています。
ただ、まずは基礎となるSQLと sqlite3 モジュールの使い方を理解しておくことが、遠回りに見えて一番の近道だと思います……。
まとめと学習のアドバイス
![]()
【Hiroki】
Yukiさん、ありがとうございます!
データベースを使うと、データの保存がぐっと本格的になりますね。
まずはSQLiteで、自分なりの小さなツールを作ってみたいと思います。
![]()
【Yuki】
それは素晴らしいですね。
最初は、自分が読んだ本の記録や、日々の学習時間を保存するような、簡単なものから始めてみるのがいいと思います。
自分の書いたコードが、誰かの、あるいは自分自身の役に立つデータとして形に残る。
それは、とても素敵なことだと私は思います……。
もし操作に迷ったら、公式サイトのドキュメントも参考にしてみてくださいね。 少し難しい表現もありますが、正確な情報が載っていますから。
![]()
【Hiroki】
はい!頑張って挑戦してみます。
また分からないことがあったら、教えてください。
![]()
【Yuki】
ええ、いつでもどうぞ。
Hirokiくんのペースで、一歩ずつ進んでいきましょう。
応援していますね……。
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

