PythonからDB(MySQL)に接続してレコード操作する機会がありまして、公式によるドキュメントが少しわかりにくかったので、まとめてみました。(MySQLのドキュメントは導線がちょっとわかりにくい気がする・・・。)
とりあえず最低限のPython→MySQLのCRUD操作はまとめているので、参考になれば幸いです。
環境
Python
$ python --version Python 3.6.5
MySQL
mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.28 | +-----------+ 1 row in set (0.00 sec)
mysql-connector-python
PythonからMySQLへの接続はmysql-connector-pythonを使用します。
$ pip show mysql-connector-python Name: mysql-connector-python Version: 8.0.19
導入はpipでインストール可能です。
$ pip install mysql-connector-python
インストールについての解説は、以下の公式によるドキュメントを参考としました。
使用するテーブル
サンプルとして社員情報を管理するテーブルを準備しました。本当に必要最低限の項目のみ定義しています。
employees(社員情報)
id | name | age | sex |
1 | 社員1 | 43 | 0 |
2 | 社員2 | 30 | 1 |
3 | 社員3 | 28 | 0 |
4 | 社員4 | 35 | 1 |
5 | 社員5 | 52 | 0 |
レコード操作方法
データベース接続
import mysql.connector cnx = mysql.connector.connect( user="root", password="password", host="localhost", database="hogehoge_database" ) cnx.close()
参考にしたMySQL公式ガイドは以下です。
以降の項は上記の接続処理を行ったものとして進めて頂ければと思います。
レコードの取得
cursor = cnx.cursor() query = "SELECT * FROM employees" cursor.execute(query) rows = cursor.fetchall() for row in rows: print(row)
コネクションからcurosrインスタンスを作成し、クエリを実行します。この形で実行すると、以下のようにrowに配列として値が設定されて取得されます。
(1, '社員1', 43, 0) (2, '社員2', 30, 1) (3, '社員3', 28, 0) (4, '社員4', 35, 1) (5, '社員5', 52, 0)
cursorをフェッチする部分は以下を参照。
ただし、列の参照時に配列だと少し使いにくいので、cursorインスタンス作成時にレコードを辞書型で取得するように引数を指定します。
cursor = cnx.cursor(dictionary=True)
上記のcursorで同じクエリを実行すると、辞書型で取得される為、row[“列名”]で値を参照することができます。
{'id': 1, 'name': '社員1', 'age': 43, 'sex': 0} {'id': 2, 'name': '社員2', 'age': 30, 'sex': 1} {'id': 3, 'name': '社員3', 'age': 28, 'sex': 0} {'id': 4, 'name': '社員4', 'age': 35, 'sex': 1} {'id': 5, 'name': '社員5', 'age': 52, 'sex': 0}
cursorの取得結果を辞書型にする部分は以下を参照。
レコードの追加/更新/削除
query = "INSERT INTO employees (name, age, sex) VALUES ('社員A', 35, 0)" cursor.execute(query) cnx.commit()
cursorを使用したレコード追加処理は以下を参考にしています。
レコードの追加、更新、削除も基本的にcursorにクエリ文字列を渡してあげる形です。コミット/ロールバックに関して、デフォルトでは自動コミットがオフとなる為、明示的にコミット/ロールバックする必要があります。
以下、公式ドキュメントの該当箇所をブラウザの自動翻訳で翻訳したものです。ギリギリ意味はわかりますね。
デフォルトでは、Connector / Pythonは 自動コミットをオフにし、MySQL 5.5
InnoDB
以降はデフォルトでトランザクションテーブルを使用するため、接続のcommit()
メソッドを使用して変更をコミットする必要があります。メソッドを使用して ロールバックすることもできrollback()
ます。