投稿日:2020年11月16日
PyMySQLはMySQLをPythonから操作するクライアントライブラリの一つです。この記事ではPyMySQLの使い方の基礎とユースケースについて解説しています。
実験環境としてDockerコンテナでmysql環境を作成します。
作成にはDocker、Docker Composeのインストールが必要になります。
すでに独自のMySQL環境がある方は無視して次の実践(基礎)に進んでください。
version: "3"
services:
mysql:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mydb
ports:
- 3306:3306
上記ファイルを作成してDocker Composeからコンテナを作成させましょう。
$ sudo docker-compose up -d
作成した環境の内容としては重要な点は以下のとおりです。
まずはPyMySQLをインストールします(各自の環境に合わせてsudoを付けたりpip3に変えたりしてね)。
$ pip install pymysql
では実際にコードに入っていきます。
ここではローカルのPythonインタプリタでからの実行を前提に一行ずつ説明していきます。
まずはライブラリをimportします。
import pymysql
MySQLの接続情報を元にpymysql.connect()メソッドでMySQLへのコネクションを作成します。
必須な引数は以下のとおりです。
また、今回はデータベースでmydbを使用します。
使用データベースはオプションのdb引数にデータベース名を指定します。
connection = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='mydb')
Cursor Objectを作成します。
Cursor Objectは実際にデータベースを管理するオブジェクトになります。
cursor = connection.cursor()
カーソルが作成できたら、SQLを実行しましょう。
cursorのexecute()メソッドでSQL文の実行ができます。メソッドの返り値はSQLの実行に際し変更された行数が返ります。
cursor.execute("CREATE TABLE sample_tbl (id int, firstname varchar(255), lastname varchar(255));")
今回はテーブルの作成なのでデータの取得などはありませんが、データの取得がある場合にはfetchone()、fetchall()などのメソッドでデータの取得をしましょう。
cursor.fetchone()
デフォルトではAUTO_COMMIT=Falseになっているため、SQLの実行の反映には手動でのCOMMITが必要になります。
COMMITはConnectionのcommit()メソッドで実行できます。
connection.commit()
ソケットを閉じて終了するにはConnectionのclose()メソッドを呼びます。
connection.close()
実際のコードの場合、コードが途中終了した場合などにcursorのclose()やconnectionのclose()を呼び忘れないようにする必要があります。
その実装の方法は有名所で2つあるので下に例を載せておきます。
import pymysql
connection = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='mydb')
try:
with connection.cursor() as cursor:
sql = "INSERT INTO sample_tbl (id, firstname, lastname) VALUES (1, 'mars', 'quai');"
cursor.execute(sql)
connection.commit()
finally:
connection.close()
import pymysql, contextlib
connection = pymysql.connect(host='localhost', port=3306, user='root', password='root', db='mydb')
with contextlib.closing(connection):
with connection.cursor() as cursor:
sql = "INSERT INTO sample_tbl (id, firstname, lastname) VALUES (1, 'mars', 'quai');"
cursor.execute(sql)
connection.commit()