Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Pythonで学ぶSQL入門

 Pythonで学ぶSQL入門

Pythonで学ぶSQL入門
## SQLiteを使ってデータベースの世界へようこそ

Avatar for MIKIO KUBO

MIKIO KUBO

July 10, 2025
Tweet

More Decks by MIKIO KUBO

Other Decks in Programming

Transcript

  1. なぜ「SQLite 」から始めるの? 数あるデータベースの中でも、SQLiteは初学者にとって最 高のパートナーです。 面倒な設定が一切不要! サーバーのインストールや起動が必要ありませ ん。データベース全体が 単一のファイルになりま す。 Python

    に標準で入っている! 追加のインストールは不要。 import sqlite3 と 書くだけですぐに始められます。 学習に集中できる! 初心者がつまずきがちな「環境構築」を完全にス キップできます。 すぐにコードを書き始め、SQLの核心的な部分を 学べます。 3
  2. 接続の【超重要】ベストプラクティス with 文を使おう! with 文を使うと、ブロック内の処理が終わったときに 自動で接続を安全に閉じてくれます。 うっかり閉じ忘れる心配がなく、コードも綺麗になります。 import sqlite3 #

    with文を使えば、conn.close()を書き忘れても大丈夫! try: with sqlite3.connect('example.db') as conn: print("データベースに安全に接続しました。") # このブロックの中でデータベース操作を行います except sqlite3.Error as e: print(f"エラーが発生しました: {e}") # このブロックを抜けると自動で後片付けしてくれます これからは、常に with 文を使いましょう! 5
  3. テーブルの設計図:CREATE TABLE 文 テーブルは CREATE TABLE というSQL命令文を使って作成します。 CREATE TABLE IF

    NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, -- 重複しない連番(主キー) name TEXT NOT NULL, -- 文字列、空っぽはダメ age INTEGER, -- 整数 email TEXT UNIQUE -- 文字列、他の人と同じメールアドレスはダメ ); IF NOT EXISTS : 同じ名前のテーブルがあってもエラーにしないおまじない。 PRIMARY KEY : 各行を区別するための「ゼッケン番号」。絶対に重複しません。 NOT NULL , UNIQUE : データの品質を保つための「ルール」(制約)です。 7
  4. Python からテーブルを作成する cursor オブジェクトを使って、PythonからSQL文を送信します。 import sqlite3 sql = """ CREATE

    TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, email TEXT UNIQUE ); """ try: with sqlite3.connect('example.db') as conn: cursor = conn.cursor() # SQL文を実行するためのカーソルを作成 cursor.execute(sql) # SQL文を実行! print("テーブル 'users' が作成されました。") except sqlite3.Error as e: print(f"エラー: {e}") 8
  5. C: Create ( データの作成・挿入) INSERT INTO 文でテーブルに新しい行(データ)を追加します。 最重要ポイント SQL文に直接値を書き込むのは危険です(SQL インジェクション攻撃の原因になります)。

    必ずプレースホルダー ? を使いましょう。 # プレースホルダー(?)を使った安全な方法 sql = "INSERT INTO users (name, email) VALUES (?, ?)" user_data = ('Alice', '[email protected]') cursor.execute(sql, user_data) 変更を保存するには commit() が必要です! conn.commit() は、変更内容をファイルに「セーブ」する命令です。 10
  6. もっと効率的に!まとめてデータを挿入 たくさんのデータを一件ずつ挿入するのは非効率。 executemany() を使えば、一括で高速に挿入できます。 many_users = [ ('Bob', '[email protected]'), ('Charlie',

    '[email protected]'), ('David', '[email protected]') ] # executemanyでリストのデータをまとめて挿入! sql = "INSERT INTO users (name, email) VALUES (?, ?)" cursor.executemany(sql, many_users) conn.commit() # 忘れずにコミット! print(f"{cursor.rowcount}件のデータを挿入しました。") これは、データベースとの通信回数を減らすことで、パフォーマンスを劇的に向上させます。 11
  7. R: Read ( データの読み出し・検索) SELECT 文でデータを取得します。 fetchall() : 結果を すべてリストとして取得します。

    fetchone() : 結果の 最初の1 件だけを取得します。 # 全ユーザーのデータを取得 cursor.execute("SELECT * FROM users") all_users = cursor.fetchall() for user in all_users: print(user) # (1, 'Alice', '[email protected]') # (2, 'Bob', '[email protected]') ... # IDが1のユーザーだけを取得 cursor.execute("SELECT * FROM users WHERE id = ?", (1,)) one_user = cursor.fetchone() print(one_user) # (1, 'Alice', '[email protected]') WHERE 句を使うと、条件に合うデータだけを絞り込めます。 12
  8. 検索を極める ( 賢くデータを取り出す) SELECT 文はとても柔軟です。 欲しい列だけを選ぶ * の代わりに列名を指定すると、必要なデータだけを取得でき、効率的です。 # 名前とメールアドレスだけが欲しい場合

    cursor.execute("SELECT name, email FROM users") for user in cursor.fetchall(): print(user) # ('Alice', '[email protected]') # ('Bob', '[email protected]') ... 条件で絞り込む ( WHERE ) WHERE 句を使えば、探しているデータをピンポイントで見つけられます。 cursor.execute("SELECT * FROM users WHERE name = ?", ('Bob',)) bob = cursor.fetchone() print(bob) 13
  9. U: Update ( データの更新) UPDATE 文で既存のデータを変更します。 超・超・重要 WHERE 句を絶対に忘れないでください! もし忘れると、テーブルの

    すべての行が同じ内容に更新されてしまいます! sql = "UPDATE users SET email = ? WHERE name = ?" new_data = ('[email protected]', 'Alice') cursor.execute(sql, new_data) conn.commit() # 変更をセーブ print("Aliceさんのメールアドレスを更新しました。") 14
  10. D: Delete ( データの削除) DELETE FROM 文でデータを削除します。 これも超・超・重要 WHERE 句を絶対に忘れないでください!

    もし忘れると、テーブルの すべてのデータが消えてしまいます! sql = "DELETE FROM users WHERE name = ?" target_user = ('David',) cursor.execute(sql, target_user) conn.commit() # 変更をセーブ print("Davidさんのデータを削除しました。") DROP TABLE users はテーブル自体を消す、さらに強力な命令です。実行は慎重に! 15
  11. 転ばぬ先の杖:エラー処理 データベース操作には予期せぬエラーがつきものです。 try...except 文でエラーを捕まえて、プログラムが突然落ちるのを防ぎましょう。 try: with sqlite3.connect('example.db') as conn: cursor

    = conn.cursor() # わざとエラーを起こす (同じメールアドレスを登録しようとする) cursor.execute("INSERT INTO users (name, email) VALUES (?,?)", ('Eve', '[email protected]')) conn.commit() except sqlite3.IntegrityError as e: # UNIQUE制約違反などの「ルール違反」エラー print(f"データ登録エラーです: {e}") except sqlite3.Error as e: # その他のSQLite関連エラー print(f"データベースエラーです: {e}") 16
  12. まとめと次のステップ 学んだこと SQLiteは設定不要で初学者に最適なデータベース。 with sqlite3.connect(...) で安全に接続。 CREATE TABLE でテーブル(表)を作成。 CRUD

    操作 ( INSERT , SELECT , UPDATE , DELETE )。 **プレースホルダー( ? )**で安全なSQL文を作成。 変更後は** conn.commit() **でセーブする。 WHERE 句の重要性。 17
  13. 次のステップへ 基本をマスターしたあなたは、もう立派なデータベース使いです! さらに深く学ぶには: JOIN : 複数のテーブルを繋げて、より複雑なデータを取得する。 ORM: SQLを書かずにPythonのオブジェクトでDBを操作するツール( SQLAlchemy など)。

    他のDB に挑戦: PostgreSQLやMySQLなど、より高機能なデータベース。 データベースの世界は奥深く、とても強力です。 この学びを土台に、さらに探求を続けていきましょう! Happy Hacking! 18