PythonからMySQLを操作する:PyMySQLの基礎と実装

PyMySQLを学ぶ理由

数万件のレコードをMySQLに挿入する場合、手作業での入力は現実的ではありません。Pythonコードからデータベースに接続し、CRUD操作を自動化することで、このような大量データの処理を効率よく行えます。

モジュールのインストール

パッケージのインストールはpip経由で行います。

pip install pymysql

アンインストールする場合は以下のコマンドを実行します。

pip uninstall pymysql

PyMySQLの基本的な使い方

1. 接続オブジェクトの作成

pymysql.connect()関数を呼び出してデータベースとの接続を確立します。主なパラメータは以下の通りです。

  • host: 接続先のホスト名(ローカルの場合は127.0.0.1localhost
  • port: ポート番号(デフォルトは3306)
  • user: データベースユーザー名
  • password: パスワード
  • database: 接続先のデータベース名
  • charset: 文字エンコーディング(utf8mb4などを推奨)

接続オブジェクトの主要なメソッド:

  • close(): 接続を閉じる
  • commit(): トランザクションをコミットする
  • rollback(): トランザクションをロールバックする

2. カーソルオブジェクトの取得

SQL文を実行するには、接続オブジェクトからカーソルを取得します。

  • execute(query): SQL文を実行し、影響を受けた行数を返す
  • fetchone(): 結果から1行を取得する(タプルを返す)
  • fetchall(): 結果から全行を取得する(タプルのタプルを返す)
  • close(): カーソルを閉じる

データの取得(SELECT)

import pymysql

# データベースへの接続を確立
db_conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='admin',
    password='secret',
    database='sample_db',
    charset='utf8mb4'
)

# カーソルの取得
cur = db_conn.cursor()

# クエリの実行
query = "SELECT id, name FROM employees;"
affected_rows = cur.execute(query)
print(f"取得したレコード数: {affected_rows}")

# 全件取得して出力
for row in cur.fetchall():
    print(row)

# リソースの解放
cur.close()
db_conn.close()

データの更新・挿入・削除(INSERT / UPDATE / DELETE)

import pymysql

# データベースへの接続を確立
db_conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='admin',
    password='secret',
    database='sample_db',
    charset='utf8mb4'
)

cur = db_conn.cursor()

try:
    # 更新クエリの実行例
    update_query = "UPDATE employees SET name = 'Taro Yamada' WHERE id = 5;"
    affected_rows = cur.execute(update_query)
    print(f"影響を受けた行数: {affected_rows}")
    
    # トランザクションのコミット
    db_conn.commit()
except Exception as err:
    print(f"エラー発生: {err}")
    # 処理に失敗した場合はロールバック
    db_conn.rollback()
finally:
    # リソースの解放
    cur.close()
    db_conn.close()

PyMySQLではデータの変更操作はトランザクション内で実行されるため、変更を確定するには必ずcommit()を呼び出す必要があります。エラーが発生した場合はrollback()を実行し、操作前の状態に戻すことが重要です。

タグ: Python MySQL PyMySQL RDB

5月15日 03:15 投稿