このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】データベースをSQLで操作する

 ここでは、Pythonを使ってリレーショナルデータベースをSQLで操作する方法を学びます。Webアプリケーションをはじめ、多くのシステムではデータを効率的に保存・検索・更新するためにデータベースが必須となります。
 ここでは、SQLiteを例に、PythonからSQL文を発行する一連の手順(データベースの作成・テーブルの作成・データ追加や変更など)を紹介します。データベースの基本的な扱いを身につけることで、今後のWebプログラミングやサービス開発をより強固なものにできるでしょう。

プログラムのダウンロード

 「ダウンロード」から実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.SQLとリレーショナルデータベースの基本

  1. リレーショナルデータベース(RDB)
    ・データを行と列からなる「テーブル」の形式で格納。
    ・テーブル同士の関係(リレーション)を管理し、大量データの高速検索や更新が可能。
  2. SQL(エスキューエル)
    ・RDBに対して操作を行うための共通言語。
    ・検索(SELECT)、追加(INSERT)、更新(UPDATE)、削除(DELETE)などの命令を発行。

 Python からは、RDBMS にSQL文を送ることで、テーブルの作成・編集やデータの検索などを行います。

2.SQLiteを使ったデータベースの作成

2.1.sqlite3モジュールのインポート

 PythonにはSQLite用のドライバが標準搭載されており、追加インストール不要です。以下のようにインポートします。

import sqlite3

2.2.データベースに接続してテーブルを作成

 データベースファイル(例: shop.db)が存在しない場合は新規に作成されます。以下は「accountテーブルを削除→作成」する例です。

「create_database.py」の内容

import sqlite3

def create_database():
    # shop.db に接続(存在しない場合は作成)
    con = sqlite3.connect('shop.db')
    cur = con.cursor()
    
    # テーブルが存在すれば削除
    cur.execute("DROP TABLE IF EXISTS account")
    
    # user(ユーザ)と password(パスワード)の2列を持つtableを作成
    cur.execute("CREATE TABLE account (user TEXT PRIMARY KEY, password TEXT)")
    
    con.commit()
    con.close()
    
if __name__ == "__main__":
    create_database()
    print("Database and table created.")
  • sqlite3.connect('shop.db') : DBファイルに接続。
  • cursor() : SQL文を実行するためのカーソルを取得。
  • execute(sql) : SQL文を実行(テーブル作成や削除など)。
  • commit() : 変更を確定。
  • close() : 接続を閉じる。

3.データを登録(INSERT)・取得(SELECT)

3.1.INSERTでデータを追加

 複数行まとめて追加したい場合はexecutemany()が便利です。以下の例ではユーザ名とパスワードをタプルで渡し、DBに登録します。

「insert_users.py」の内容

import sqlite3

def insert_users():
    con = sqlite3.connect('shop.db')
    cur = con.cursor()
    
    account_data = [
        ('suzuki', 'abc123'),
        ('sato', 'def456'),
        ('takahashi', 'ghi789')
    ]
    # INSERT文の?部分にそれぞれタプルの要素が代入される
    cur.executemany("INSERT INTO account VALUES (?, ?)", account_data)
    con.commit()
    con.close()
    print("Inserted users:", account_data)

if __name__ == "__main__":
    insert_users()

3.2.SELECTでデータを取得

 テーブルからデータを取り出すには、SELECT文を実行し、その結果を1行ずつ読み取ります。以下の例で取得した行はタプルとして取得できます。

「show_users.py」の内容

import sqlite3

def show_users():
    con = sqlite3.connect('shop.db')
    cur = con.cursor()
    
    cur.execute("SELECT * FROM account")
    for user, password in cur:  # 1行ずつのタプル (user, password)
        print(f"{user:10} {password}")
    
    con.close()

if __name__ == "__main__":
    show_users()

for user, password in cur: : カーソルをイテレータとして扱い、各行(タプル)を受け取る。

4.データの更新(UPDATE)・削除(DELETE)

4.1.UPDATE

 UPDATE account SET password=? WHERE user=?のように条件を指定できます。たとえばユーザsuzukiのパスワードを変更する例です。

「update_password.py」の内容

import sqlite3

def update_password(user, new_pass):
    con = sqlite3.connect('shop.db')
    cur = con.cursor()
    cur.execute("UPDATE account SET password=? WHERE user=?", (new_pass, user))
    con.commit()
    con.close()
    print(f"Updated {user}'s password to {new_pass}")

if __name__ == "__main__":
    update_password("suzuki", "password")

4.2.DELETE

条件に合う行を削除する場合はDELETE文を使います。

「delete_user.py」の内容

import sqlite3

def delete_user(user):
    con = sqlite3.connect('shop.db')
    cur = con.cursor()
    cur.execute("DELETE FROM account WHERE user=?", (user,))
    con.commit()
    con.close()
    print(f"Deleted user: {user}")

if __name__ == "__main__":
    delete_user("takahashi")

5.ログイン機能の例

 データベースのテーブルを使い、ユーザ名とパスワードによるログイン判定を行う簡単なサンプルです。ユーザ名・パスワードが正しければ「Welcome!」そうでなければ「Failed.」と表示します。

「login.py」の内容

import sys
import sqlite3

def login(user, passwd):
    con = sqlite3.connect('shop.db')
    cur = con.cursor()
    
    # user列とpassword列が両方一致する行を検索
    cur.execute("SELECT * FROM account WHERE user=? AND password=?", (user, passwd))
    
    # 結果が空でなければログイン成功
    result = list(cur)
    con.close()
    
    if result:
        print("Welcome!")
    else:
        print("Failed.")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        sys.exit(f"Usage: python {sys.argv[0]} <user> <password>")
    
    login(sys.argv[1], sys.argv[2])

実行例

> python login.py suzuki abc123
Failed.
> python login.py suzuki password
Welcome!

まとめ

 リレーショナルデータベースを用いると、大量データや複雑な検索条件にも容易に対応でき、Webアプリや業務システムで幅広く活用されます。Pythonからはsqlite3モジュールを使って

  1. connect でDBに接続
  2. cursor でSQL文を実行
  3. commit で変更を反映
  4. close で接続終了

 という手順で操作します。データの追加・参照・更新・削除などの基本処理はSQL文(INSERT / SELECT / UPDATE / DELETE)を用い、それらを組み合わせることでユーザ管理やログイン機能などを構築可能です。

 次のコンテンツでは、データベースとWebプログラミングを連携させ、Webアプリケーションとしての機能を作成していきます。Webフォームからデータを受け取り、DBに登録し、またブラウザで検索結果を表示するといった流れをマスターして、より実践的なシステム開発を体験しましょう。