【Python3】MySQL 操作をひと通りマスター!導入方法とCRUDサンプルコード集

この記事では Python3 で MySQL を操作する方法をひと通りまとめました。MySQL ドライバの導入方法、SQL文によるCRUD操作やエラー処理をサンプル付きで紹介します。

MySQL の操作は「SQLによる直接操作」と「ORMによる間接操作」の2通りがありますが、この記事では「SQLによる直接操作」を行います。

※「ORMによる間接操作」については SQLAlchemy について記事追加予定です。

ソースコードのダウンロード

この記事で紹介するサンプルソースコードは Github からダウンロードできます。記事ではソースコードを切り出して紹介する形になるので、スクリプト全体を把握するには Githubのソースコードが良いでしょう。
Github でソースコードをチェック

MySQL ドライバの導入

SQLite のように標準モジュールはありません。Python3 で MySQL を操作するには、まずドライバをインストールする必要があります。

ドライバにはいくつかの選択肢がありますが、2018年時点ではmysqlclient(MySQLdb)がデファクトスタンダードとなっています。

mysqlclient はWEBアプリケーション・フレームワーク「Django 2」の推奨ドライバとなっています。また、Python の定番ORM「SQLAlchemy」にも対応しています。

mysqlclient のインストール

mysqlclient のインストールは下記 pip install コマンドを実行すれば完了です。

mysqlclient 関連リンク

PyPI
https://pypi.python.org/pypi/mysqlclient

Github
https://github.com/PyMySQL/mysqlclient-python

Document
https://mysqlclient.readthedocs.io/

 

データベース作成

Python からデータベースを作成することもできますが、データベースについては SQL で直接作るのが一般的でしょう。ここでは下記SQL文を実行してデータベース sample_db を作っておくことにします。

 

データベース接続・エラー処理

まずはデータベース接続のサンプルコードを見てみましょう。

 

ポイントは3つです。

import MySQLdb

まず MySQLdb モジュールをインポートします。突然 MySQLdb というモジュールが出てきましたが、これは先ほどの「mysqlclient のインストール」の項で実行した  $ pip3 install mysqlclient コマンドによりインストールされるモジュールです。

MySQLdb.connect()

MySQLに接続するには MySQLdb.connect() メソッドを実行します。

MySQLdb.Error

接続できなかった場合などのエラーハンドリングは MySQLdb.Error を使います。なお MySQLdb.Error は接続だけでなく、クエリ実行エラーなどMySQL 操作についてのエラー全般(例外)をキャッチします。

以下のサンプルコードではエラー処理(例外処理)を省略していますが、SQL実行時には適宜 MySQLdb.Error による例外処理を実装しましょう。

テーブルの作成

生徒のID、名前、点数の3つのカラムで構成されるテーブル「studenets」を作成してみます。

 

ポイントは2つです。

connection.cursor()

mysqlclient(MySQLdb)ではカーソルによりSQL文を実行します。まずは上記コードのように connection.cursor() メソッドでカーソルを取得します。

cursor.execute()

cursor.execute() メソッドでSQL文を実行します。

 

データの追加 INSERT

INSERT 文によりテーブルにデータを追加します。下記のようにプレースホルダの使用や複数レコードの同時挿入も可能です。

connection.commit()

INSERT 文を cursor.execute() で実行しただけでは、データが保存されないことに注意しましょう。MySQLにデータを保存するには必ず connection.commit() を実行します。

 

データの抽出 SELECT

SELECT 文と実行結果の処理方法について見ていきます。

全レコードの取得・件数取得

 

1レコードの取得

 

WHERE 句

WEHRE句により条件を指定してみます。プレースホルダの使い方、該当結果がない場合の fetchall(), fetchone() メソッドの返り値の違いを把握しておきましょう。

 

結果のループ処理

抽出結果のループ処理は2つの方法がありますが、fetchall() を使用しない方がスマートでしょう。

 

結果を辞書型で取得するには?

SELECT の実行結果はデフォルトでは「タプル」になります。辞書型(連想配列)として取得するには、下記のようにカーソル生成時の引数に MySQLdb.cursors.DictCursor をセットします。

 

具体的なコードでデータの取り出し方を比較してみます。

 

デフォルトのカーソルは row[0], row[1] … のように 0から始まるインデックス番号でカラムの値を取得します。これに対し、MySQLdb.cursors.DictCursor を指定すると、row[‘id’],  row[‘name’] といったカラム名をキーにして値を取得することができます。

デフォルトのカーソルより変更に強い

デフォルトのカーソルでは、SQLが「SELECT * FROM students …」 の場合には row[1] で名前を取得しますが、SQLを「SELECT name FROM students … 」に変更すると、 row[0] で取得することになります。

 

一方、MySQLdb.cursors.DictCursor を指定したカーソルでは、SQLを変えても row[‘name’] のまま取得できます。

 

ソースコードの可読性向上だけでなく、変更に強いという利点もあります。

 

データの更新 UPDATE

UPDATE文を実行後に connection.commit() するのを忘れないようにしましょう。

 

データの削除 DELETE

DELETE文を実行後に connection.commit() するのを忘れないようにしましょう。

 

以上となります。

この記事のソースコードについては Github でソースコードをチェックできます。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です