Python入門:mysql-connector-pythonでMySQL操作を学ぶ

アプリケーションでデータを扱う際、RDBMS(リレーショナルデータベース管理システム)は欠かせません。

PythonからMySQLを操作するには公式のドライバであるmysql‑connector‑pythonが便利です。

本記事ではインストールから基本的なCRUD操作(Create, Read, Update, Delete)まで、初心者向けに丁寧に解説します。


環境準備

  • Pythonのバージョン:3.6以降を推奨
  • MySQLサーバー:ローカル or リモートにMySQL 5.7以上
  • 仮想環境:venvやcondaで環境を管理
# Windows/macOS/Linux 共通
python3 -m venv myenv
source myenv/bin/activate   # Windows: myenv\Scripts\activate

mysql‑connector‑pythonのインストール

pip install mysql-connector-python

インストールが完了したら、Python REPLで動作を確認します。

>>> import mysql.connector
>>> print(mysql.connector.__version__)

MySQLサーバーへの接続

import mysql.connector
from mysql.connector import Error

try:
    conn = mysql.connector.connect(
        host='localhost',
        user='your_user',
        password='your_password'
    )
    if conn.is_connected():
        print('MySQLサーバーに接続しました。')
except Error as e:
    print(f'接続エラー: {e}')
finally:
    if conn.is_connected():
        conn.close()
  • host:サーバーのアドレス(ローカルならlocalhost)
  • user / password:MySQLユーザー情報

データベースとテーブルの作成

conn = mysql.connector.connect(...)
cursor = conn.cursor()

# データベース作成
cursor.execute("CREATE DATABASE IF NOT EXISTS sample_db;")
cursor.execute("USE sample_db;")

# テーブル作成
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
"""
cursor.execute(create_table_sql)
conn.commit()
cursor.close()
conn.close()

データの挿入(Create)

def insert_user(name, email):
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor()
    sql = "INSERT INTO users (name, email) VALUES (%s, %s)"
    cursor.execute(sql, (name, email))
    conn.commit()
    print(f"{cursor.rowcount}件のレコードを挿入しました。")
    cursor.close()
    conn.close()

# 実行例
insert_user('Taro Yamada', 'taro@example.com')

プレースホルダ %s を使い、SQLインジェクションを防止できます。


データの取得(Read)

def fetch_users():
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor(dictionary=True)
    cursor.execute("SELECT * FROM users;")
    rows = cursor.fetchall()
    for row in rows:
        print(row)
    cursor.close()
    conn.close()

# 実行例
fetch_users()

dictionary=True を指定すると、カラム名をキーとする辞書で取得できます。


データの更新(Update)

def update_email(user_id, new_email):
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor()
    sql = "UPDATE users SET email = %s WHERE id = %s"
    cursor.execute(sql, (new_email, user_id))
    conn.commit()
    print(f"{cursor.rowcount}件のレコードを更新しました。")
    cursor.close()
    conn.close()

# 実行例
update_email(1, 'new_email@example.com')

データの削除(Delete)

def delete_user(user_id):
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor()
    sql = "DELETE FROM users WHERE id = %s"
    cursor.execute(sql, (user_id,))
    conn.commit()
    print(f"{cursor.rowcount}件のレコードを削除しました。")
    cursor.close()
    conn.close()

# 実行例
delete_user(1)

エラーハンドリング

from mysql.connector import Error

try:
    conn = mysql.connector.connect(...)
    # 各操作...
except Error as e:
    print(f"MySQLエラー:{e}")
finally:
    if conn.is_connected():
        conn.close()

必ず try / except / finally で接続のクローズをしましょう。


ベストプラクティス

  1. 接続の使い回し:大量のクエリ実行時はプールを利用
  2. パラメータ化クエリ:SQLインジェクション対策
  3. 例外ログ:エラー時はログ出力
  4. トランザクション管理:複数操作の原子性を保証

まとめ

  • mysql‑connector‑python でPythonからMySQLを簡単に操作可能
  • 基本のCRUDをマスターし、エラーハンドリングやベストプラクティスを押さえれば安心
  • 実際に手を動かしながら理解を深めましょう!

演習問題&解答例

演習問題

  1. 新しいテーブル products を作成し、以下のカラムを持たせてください
    • id(INT, AUTO_INCREMENT, PRIMARY KEY)
    • name(VARCHAR(100))
    • price(DECIMAL(10,2))
    • stock(INT)
  2. products テーブルに3件の商品データを挿入する関数 insert_products() を作成してください
  3. 価格が1000以上の商品を取得し、名前と価格を出力する関数 fetch_expensive_products() を作成してください
  4. 在庫が0の商品を削除する関数 delete_out_of_stock() を作成してください

解答例

import mysql.connector
from mysql.connector import Error

# 演習1
def setup_products_table():
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor()
    sql = """
    CREATE TABLE IF NOT EXISTS products (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        price DECIMAL(10,2) NOT NULL,
        stock INT NOT NULL
    );
    """
    cursor.execute(sql)
    conn.commit()
    cursor.close()
    conn.close()

# 演習2
def insert_products():
    items = [
        ('ノートPC', 85000.00, 10),
        ('ゲーミングマウス', 4500.50, 0),
        ('USBメモリ', 1200.00, 25)
    ]
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor()
    sql = "INSERT INTO products (name, price, stock) VALUES (%s, %s, %s)"
    cursor.executemany(sql, items)
    conn.commit()
    print(f"{cursor.rowcount}件の商品を挿入しました。")
    cursor.close()
    conn.close()

# 演習3
def fetch_expensive_products():
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor()
    sql = "SELECT name, price FROM products WHERE price >= %s"
    cursor.execute(sql, (1000,))
    for name, price in cursor.fetchall():
        print(f"商品名: {name}, 価格: {price}円")
    cursor.close()
    conn.close()

# 演習4
def delete_out_of_stock():
    conn = mysql.connector.connect(database='sample_db', ...)
    cursor = conn.cursor()
    sql = "DELETE FROM products WHERE stock = %s"
    cursor.execute(sql, (0,))
    conn.commit()
    print(f"{cursor.rowcount}件の在庫切れ商品を削除しました。")
    cursor.close()
    conn.close()

if __name__ == "__main__":
    setup_products_table()
    insert_products()
    fetch_expensive_products()
    delete_out_of_stock()

上記のコードを実行すると、products テーブルの作成からデータ操作まで一連の流れを確認できます。

ぜひ動かして、理解を深めてください!