こんにちは。現役Webエンジニアの三年坊主です。
今回は、Python3のプログラムからMySQLを操作したい人の、このような疑問に答えます。
結論としては、mysql-connector-python を pipでインストールするのが一番簡単でおすすめです。
なお、私は大学の研究と自分の趣味、最近では業務も合わせて、合計5年以上Pythonを使ってきました。
この記事では、その経験を生かして、Python3で使えるmysql connectorのインストール方法と基本的な使い方、さらに変なエラーになるべく苦しまず快適に使うための知識を紹介します。よければ参考にしてください。
この記事の内容
- Python3で使えるmysql connector【インストール】
- mysql connector pythonの基本的な使い方
- mysql connector pythonを快適に使うための知識【エラー処理】
Python3で使えるmysql connector【インストール】
Pythonプログラム単体で、これからライブラリをインストールして使いはじめる場合には、mysql-connetor-python をインストールして使いましょう。
仮想環境内に”pip install mysql-connector-python”でインストールする方法をおすすめします。
mysql connectorは、正式には”MySQL Connector/Python”といいます。Pythonプログラムからデータベースにアクセスするためのライブラリの一つです。
Pythonで使えるMySQLライブラリは他にもいくつかありますが、mysql connectorにはこのような特徴があります。
- MySQLの開発元、Oracle社によってアクティブに開発されている
- Python Database API Specification v2.0 という共通の仕様に対応
- 依存がPythonの標準ライブラリだけなのでインストールが楽
実は、Python3で使えるmysql connectorを探すと、主に2つ見つかると思いますが、
2018年9月現在の開発状況を踏まえて、mysql-connetor-pythonを選びましょう。
開発状況 | 対応している最新Pythonバージョン | 最終更新 | |
---|---|---|---|
mysql-connetor-python-rf | 4 – Beta | 3.3 | 2017年2月 |
mysql-connetor-python | 5 – Production/Stable | 3.6 | 2018年7月 |
また、mysql-connector-pythonとPythonのバージョン対応表を見てみると、特にPython3.6を使う場合は mysql-connector-pythonの最新版 (8.0) 一択のようです。
ちなみに、細かく見るとさらにたくさんのライブラリがありますが、他のライブラリを使わなくてよさそうと判断した理由も書いておきます。
1 2 3 4 5 6 7 8 9 10 | (py3env) $ pip search mysql | grep "connector" mysql-connector (2.1.6) - MySQL driver written in Python bottle-mysql-connector (0.0.4) - MySQL integration for Bottle. mysql-connector-python (8.0.12) - MySQL driver written in Python mysql-connector-repackaged (0.3.1) - MySQL driver written in Python mysql-connector-async-dd (2.0.2) - mysql async connection mysql-connector-python-dd (2.0.2) - MySQL driver written in Python mysql-connector-python-rf (2.2.2) - MySQL driver written in Python py_mysql_connector (0.1) - MySQL database connector (py3env) $ |
- mysql-connector (2.1.6):mysql-connector-pythonをもとに個人が開発している様子
- bottle-mysql-connector (0.0.4):軽量WebフレームワークBottle 向け
- mysql-connector-repackaged (0.3.1):最終更新が2012年と古い
- mysql-connector-async-dd (2.0.2):非同期処理向けに改良したもの(ただし個人ベースで開発しているように見える)
- mysql-connector-python-dd (2.0.2): Pythonの対応バージョンが3.3まで
- py_mysql_connector (0.1):mysql-connector-pythonをもとに個人が趣味的に開発している様子
インストール方法
mysql-connector-pythonを、仮想環境内にpipでインストールします。
1 2 | $ source py3env/bin/activate (py3env) $ pip install mysql-connector-python |
この記事で使う表記法
- コメント
1 | # コメントの例です |
- ターミナル上で実行するコマンド($マークは入力不要)
1 | $ which python |
- py3envという名前の仮想環境を有効化した状態で実行するコマンド(”(py3env) $” は入力不要)
1 | (py3env) $ which python |
- Pythonを起動した状態で実行するコマンド
1 | >>> import os |
このように、Pythonプログラム単体で、これからライブラリをインストールして使いはじめる場合には、mysql-connetor-pythonをインストールしましょう。
方法としては、仮想環境内に”pip install mysql-connector-python”でインストールするのがおすすめです。
mysql connector pythonの基本的な使い方
mysql-connector-pythonの基本的な使い方について説明します。
コピペで動くサンプルコードを紹介するので、mysql-connector-pythonのインストール後、すぐにMySQLに接続して操作をはじめることができます。
MacでMySQLサーバをセットアップする方法は、この記事などを参考にしてください。
接続(コネクションの作成)
1 2 3 4 5 6 7 8 9 10 | import mysql.connector # コネクションの作成 conn = mysql.connector.connect( host='localhost', port='3306', user='root', password='password', database='test_database' ) |
標準ライブラリからurlparseを使って、このように値をセットしても大丈夫です。
1 2 3 4 5 6 7 8 9 10 11 12 | import mysql.connector from urllib.parse import urlparse # コネクションの作成 url = urlparse('mysql://root:password@localhost:3306/test_database') conn = mysql.connector.connect( host = url.hostname or 'localhost', port = url.port or 3306, user = url.username or 'root', password = url.password or 'password', database = url.path[1:] or 'test_database', ) |
再接続の設定方法と、接続できているか確認する方法を紹介します。
1 2 3 4 5 | # コネクションが切れた時に再接続してくれるよう設定 conn.ping(reconnect=True) # 接続できているかどうか確認 print(conn.is_connected()) |
テーブル作成 (CREATE)
cursorメソッドを使って、コネクションからカーソルを作成します。
そのカーソルに対して、executeメソッドを使ってSQL文を実行します。
1 2 3 4 5 6 7 8 9 10 11 | # DB操作用にカーソルを作成 cur = conn.cursor() # id, name, priceを持つテーブルを(すでにあればいったん消してから)作成 cur.execute("DROP TABLE IF EXISTS `test_table`") cur.execute("""CREATE TABLE IF NOT EXISTS `test_table` ( `id` int(11) NOT NULL, `name` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL, `price` int(11) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci""") |
データ挿入 (INSERT)
id, name, priceを持つテーブルを作成したので、たとえばあなたが持っている仮想通貨の金額を、日本円換算で挿入してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 | cur.execute("INSERT INTO test_table VALUES (1, 'BTC', 10200)") # プレースホルダを利用して挿入 cur.execute("INSERT INTO test_table VALUES (2, 'ETH', %s)", (5000, )) cur.execute("INSERT INTO test_table VALUES (%s, %s, %s)", (3 ,'XEM', 2500)) cur.execute("INSERT INTO test_table VALUES (%(id)s, %(name)s, %(price)s)", {'id': 4, 'name': 'XRP', 'price': 1000}) # executemanyで複数データを一度に挿入 records = [ (5, 'MONA', 3000), (6, 'XP', 1000), ] cur.executemany("INSERT INTO test_table VALUES (%s, %s, %s)", records) |
データ選択 (SELECT)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | cur.execute("SELECT * FROM test_table ORDER BY id ASC") # 全てのデータを取得 rows = cur.fetchall() for row in rows: print(row) # 出力結果 """ (1, 'BTC', 10200) (2, 'ETH', 5000) (3 ,'XEM', 2500) (4, 'XRP', 1000) (5, 'MONA', 3000) (6, 'XP', 1000) """ # 1件取得 cur.execute("SELECT * FROM test_table WHERE name=%s", ('BTC', )) print(cur.rowcount) print(cur.fetchone()) # 出力結果 """ 1 (1, 'BTC', 10200) """ |
データ更新 (UPDATE)・データ削除 (DELETE)
1 2 3 4 5 6 | # UPDATE cur.execute('UPDATE test_table SET name=%s WHERE id=1', ('ビットコイン',)) cur.execute('UPDATE test_table SET name=%s WHERE id=%s', ('イーサリアム', 2)) # DELETE cur.execute('DELETE FROM test_table WHERE id = 3') |
コネクションを閉じる
データベースの操作が終わったら、カーソルとコネクションを閉じましょう。
1 2 3 | # DB操作が終わったらカーソルとコネクションを閉じる cur.close() conn.close() |
以上、基本的な操作方法について説明しました。
「コネクション作成→カーソル作成→操作→カーソル閉じる→コネクション閉じる」の流れになります。
mysql connector pythonを快適に使うための知識【エラー処理】
少し発展的な内容になりますが、なるべく変なエラーに苦しまず、mysql connectorを快適に使うために、簡単なエラー処理をする習慣を身につけておくと役立ちます。
エラー処理をして、実際にどのエラーが発生したのかすぐに確認できるようにしておくと、変な現象が起こった時に「何が原因か分からない!」と苦しむ時間を短くすることができるからです。
mysql-connector-python では、起こりうるエラーの一覧が整理されています。これをうまく活用しましょう。
B.3 Server Error Codes and Messages
B.4 Client Error Codes and Messages
リンク先を見ると、基本的に番号(error number)とメッセージ(error message)の組み合わせで一つのエラーが表現されているようです。
この中から、よく出現する番号とメッセージの一部を下の表にまとめます。
番号 | 対応するシンボル (SQLSTATE) | メッセージ | 考えられる原因(一部) |
---|---|---|---|
1045 | ER_ACCESS_DENIED_ERROR (28000) | Access denied for user ‘%s’@’%s’ (using password: %s) | ユーザネームかパスワードが間違っている |
1049 | ER_BAD_DB_ERROR (42000) | Unknown database ‘%s’ | 指定した名前のデータベースが存在しない |
1051 | ER_BAD_TABLE_ERROR (42S02) | Unknown table ‘%s’ | 指定した名前のテーブルが存在しない |
2002 | CR_CONNECTION_ERROR | Can’t connect to local MySQL server through socket ‘%s’ (%d) | MySQLサーバが実行されていない |
2003 | CR_CONN_HOST_ERROR | Can’t connect to MySQL server on ‘%s’ (%d) | ネットワーク接続が拒否されている |
エラー一覧の活用方法ですが、Pythonプログラムで「エラーコードとメッセージを出力して、一覧と照らし合わせられる状態にする」のが基本です。
1 2 3 4 5 6 7 8 9 | try: conn = mysql.connector.connect(database = "unknown") except mysql.connector.Error as e: print("Error code:", e.errno) # error number print("SQLSTATE value:", e.sqlstate) # SQLSTATE value print("Error message:", e.msg) # error message print("Error:", e) # errno, sqlstate, msg values s = str(e) print("Error:", s) # errno, sqlstate, msg values |
上のプログラムを実行して、もしこのようなエラーが出たら、「指定した名前のデータベースが存在しない」ということが分かります。
1 2 3 4 5 | Error code: 1049 SQLSTATE value: 42000 Error message: Unknown database 'unknown' Error: 1049 (42000): Unknown database 'unknown' Error: 1049 (42000): Unknown database 'unknown' |
より実践的には、このようにするといいでしょう。
- “from mysql.connector import errorcode”を一行追加する
- mysql-connector-python関係でエラーが起こりそうなところをtryとexceptではさむ
- 事前に予想できるエラーはなるべくif文で場合分けして、原因が分かりやすいメッセージを出力する
- それ以外のエラーは、エラー内容をそのまま出力して一覧で確認できるようにする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import mysql.connector from mysql.connector import errorcode try: conn = mysql.connector.connect(user='root', database='test_database') cur = conn.cursor() cur.execute("INSERT INTO test_table VALUES (1, 'BTC', 10200)") except mysql.connector.Error as e: if e.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong with your user name or password") elif e.errno == errorcode.ER_BAD_DB_ERROR: print("Database does not exist") else: print(err) cur.close() conn.close() |
エラー処理をしてエラーの内容を確認しやすい状態にすると、あなた自身で修正の手がかりがつかみやすいですし、人に聞くときにも原因を正しく伝えられるので、時間の節約になります。
コピペからはじめて大丈夫なので、簡単なエラー処理を組み込んで、mysql connectorを快適に使いましょう。
Pythonのインストール・環境構築の記事もよければご覧ください。