アプリケーションでデータを扱う際、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 で接続のクローズをしましょう。
ベストプラクティス
- 接続の使い回し:大量のクエリ実行時はプールを利用
- パラメータ化クエリ:SQLインジェクション対策
- 例外ログ:エラー時はログ出力
- トランザクション管理:複数操作の原子性を保証
まとめ
- mysql‑connector‑python でPythonからMySQLを簡単に操作可能
- 基本のCRUDをマスターし、エラーハンドリングやベストプラクティスを押さえれば安心
- 実際に手を動かしながら理解を深めましょう!
演習問題&解答例
演習問題
- 新しいテーブル products を作成し、以下のカラムを持たせてください
- id(INT, AUTO_INCREMENT, PRIMARY KEY)
- name(VARCHAR(100))
- price(DECIMAL(10,2))
- stock(INT)
- products テーブルに3件の商品データを挿入する関数 insert_products() を作成してください
- 価格が1000以上の商品を取得し、名前と価格を出力する関数 fetch_expensive_products() を作成してください
- 在庫が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 テーブルの作成からデータ操作まで一連の流れを確認できます。
ぜひ動かして、理解を深めてください!