Blow Up by Black Swan

Pythonーmysql-connector-pythonモジュールのfetch関連メソッド(fetchall, fetchmany, fetchone, fetchwarnings)

前回、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メソッドの使い方

使い方は非常に簡単ですが、下記に実際のコードを書いています。今回利用するデータテーブルは以下になります。

noidprice
1336750
2258720
31085850
420030000

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に準拠しているモジュールはここら辺の基本部分は共通していると思うので、ほかのモジュールでも似たような使い方ができるんじゃないかと思います。

参考になりましたら幸いです。

読んで頂き、ありがとうございました。