前回、mysql-connector-pythonのexecuteメソッドとexecutemanyメソッドについて学習しましたが、今回は4つのfetchメソッドの使い方について学習したので、それについてまとめようと思います。今回も主要参考サイトはmysql-connector-pythonの公式ドキュメント(MySQLの公式ドキュメント)になります。
MySQL Connector/Python Developer Guide
また、以前まとめたmysql-connector-pythonモジュールの公式ドキュメント記載のチュートリアルについても前回の記事と併せ参考になれば幸いです。
1. 構築環境
今回の構築環境は、前回同様、以下になります。
PC: Macbook MySQL: ver8.0.13 mysql-connector-python: 8.0.13 python: 3.7
2. 4つのfetchメソッドの概要と特徴(fetchall, fetchmany, fetchone, fetchwarinings)
fetchは「取ってくる」という意味の英語で、DBからデータを取得するために使われます。fetchと付くメソッドは4つありますが(fetchall、fetchmany、fetchone、fetchwarnings)、その違いは、データを「いくつ」取ってくるか、と「何を」取ってくるかという点です。以下が4つのfetchメソッドの特徴です。
- 共通する基本的な特徴
- cursorオブジェクトのメソッド
- MySQLserverからデータを取得するメソッド(BufferedCursorの場合はメモリ)。「いくつ」取ってくるか、「何を」取ってくるかの点で違いがある
- execute(SELECT文) -> SELECT文の範囲内でどれだけのデータを取ってくるかをfetchメソッドで指定という流れ
- 4つのfetchメソッドのそれぞれの特徴
- fetchall() -> SELECT文で指定した全てのデータを取得
- fetchmany() -> SELECT文で指定したデータの中からどれだけのデータを取得するか指定する
- args: size=1(取ってくるデータサイズを指定する引数。デフォルトは1)
- fetchone() -> SELECT文で指定したデータの中から1つだけデータを取ってくる。fetchallメソッドやfetchmanyメソッドの基礎となるメソッド
- fetchwarnings() -> SELCT文実行時のwarningを取得する
- 事前にConnectionオブジェクトのget_warningsプロパティをTrueにしておく必要がある(デフォルトはFalse)
3. 4つのfetchメソッドの使い方
使い方は非常に簡単ですが、下記に実際のコードを書いています。今回利用するデータテーブルは以下になります。
no | id | price |
---|---|---|
1 | 33 | 6750 |
2 | 25 | 8720 |
3 | 108 | 5850 |
4 | 200 | 30000 |
3-1. fetchallメソッド
fetchallメソッドは、SELECT文で指定した範囲のデータ全てを取得するために利用されます。
import mysql.connector
execute_query = ("SELECT no, id, price from TEST.test ORDER BY no ASC")
con = mysql.connector.connect(**db_config)
cur = con.cursor()
cur.execute(execute_query) #SELECT文の範囲
cur.fetchall()
戻り値
[(1, 33, 6750), (2, 25, 8720), (3, 108, 5850), (4, 200, 30000)]
全てのデータが取得できていることが確認できます。
3-2. fetchmanyメソッド
fetchmanyメソッドは、取得するデータサイズを選択できるメソッドです。
3-2-1. fetchmanyメソッドの基本的な使い方
import mysql.connector
execute_query = ("SELECT no, id, price from TEST.test ORDER BY no ASC")
con = mysql.connector.connect(**db_config)
cur = con.cursor()
cur.execute(execute_query)
cur.fetchmany(size=2) #引数sizeに指定した文を取り出している
戻り値
[(1, 33, 6750), (2, 25, 8720)]
size引数はデフォルトでは”1″になっており、fetchoneメソッドと同じ結果になります。
3-2-2. fetchmanyメソッドのsize引数で指定した数がSELECT文で指定したデータ数より大きい場合
fetchmanyメソッドのsize引数の値がSELECT文で指定したデータ数より大きい場合、エラーは発生せずにSELCT文で指定した範囲のデータが返されます。
import mysql.connector
execute_query = ("SELECT no, id, price from TEST.test ORDER BY no ASC")
con = mysql.connector.connect(**db_config)
cur = con.cursor()
cur.execute(execute_query)
cur.fetchmany(size=10) #size > SELECTで指定されたデータ数
戻り値
[(1, 33, 6750), (2, 25, 8720), (3, 108, 5850), (4, 200, 30000)]
3-2-3. fetchmanyメソッドとfetchallメソッド
SELECT文を実行したCursorオブジェクトは、ジェネレータのようでデータが引き出されるごとにそれが記憶され、次回引き出し時はその続きのデータが返されます。
import mysql.connector
execute_query = ("SELECT no, id, price from TEST.test ORDER BY no ASC")
con = mysql.connector.connect(**db_config)
cur = con.cursor()
cur.execute(execute_query)
cur.fetchmany(size=2)
戻り値
[(1, 33, 6750), (2, 25, 8720)]
上記に続いてfetchallメソッドを実行すると、残りのデータだけが取得できます。
cur.fetchall()
戻り値
[(3, 108, 5850), (4, 200, 30000)]
3-3. fetchoneメソッド
fetchoneメソッドは、fetchall、fetchmanyメソッドの基礎となるもので、データを一つだけ取得します。
import mysql.connector
execute_query = ("SELECT no, id, price from TEST.test ORDER BY no ASC")
con = mysql.connector.connect(**db_config)
cur = con.cursor()
cur.execute(execute_query)
cur.fetchone()
戻り値
(1, 33, 6750)
3-4. fetchwarningsメソッド
最後はfetchwarningsメソッドです。これは、SELECT文を実行した時のwarnings(注意喚起文)を取得することができるメソッドです。これを利用するためには、Connectionオブジェクトを生成するときにデフォルトで”false”になっているget_warnings
プロパティを”True”に設定しておく必要があります。
con = mysql.connector.connect(**db_config, get_warnings=True)
cur = con.cursor()
cur.execute("SELECT 'a'+1")
cur.fetchall()
cur.fetchwarnings()
戻り値
[('Warning', 1292, "Truncated incorrect DOUBLE value: 'a'")]
4. まとめ
以上が今回のまとめになります。DB API2.0に準拠しているモジュールはここら辺の基本部分は共通していると思うので、ほかのモジュールでも似たような使い方ができるんじゃないかと思います。
参考になりましたら幸いです。
読んで頂き、ありがとうございました。