プログラム言語のPythonには、呼び出すだけで接続開始の処理と接続終了の処理を必ずやってくれて、データを取り出せるwith構文があります。通常は、ファイルへのアクセスに使われますが、MySQLに対するアクセスにも活用可能です。今回は、Pythonのwith構文でMySQLからデータを取り出す処理について解説します。
Pythonのwith構文とは
プログラムとは、繰り返し構文の中で何か処理をするのが基本です。そして、プログラム言語Pythonでは、他のプログラム言語でも使われる、forやwhileといった繰り替え処理が使えます。しかし、それだけではありません。ファイル操作やデータベースの処理では、繰り返し処理の代わりに、with構文が使えます。
次から、Pythonのwith構文の基本について解説します。
Pythonのwith構文の基本
Pythonのwith構文は、ファイル処理や通信処理など、データの受け入れを開始してから終了するまで、連続して処理する場合に使います。なお、同じ処理は、繰り返し処理を使った他の書き方でも可能ですが、その前後で開始処理と終了処理が必要です。それに対して、with構文では、呼び出しに成功すれば、確実に終了処理までやってくれるので、終了処理忘れを気にせずに使える点がメリットです。
with構文の書き方は、次のとおりです。
with EXPRESSION as TARGET:
SUITE
なお、上記のwith構文は、with構文を使わない書き方も可能ですが、かなり長くなってしまいます。詳しくは、Pythonの公式サイトにあるマニュアルを参照してください。
https://docs.python.org/ja/3/reference/compound_stmts.html#with
8. 複合文 (compound statement) — Python 3.8.3 ドキュメント
with構文の例
Pythonのwith構文がよく使われるのは、ファイルを読み込む処理です。次にwith構文を用いたファイル読み込みコードの例を紹介します。
with構文を使ったファイル読み込みの例 with open("potepan.txt", "r") as fd: print(fd.read())
この例では、「open(“potepan.txt”, “r”)」で読み込んだファイルを、標準出力に出力しています。ファイルの読み込みは別の方法でも可能ですが、ファイルのクローズ処理を忘れがちです。しかし、自動的にクローズ処理をやってくれるwith構文を使うことで、簡潔に書くことが可能です。
with構文はデータベースの処理にも使える
先ほど、with構文を使ったファイル読み込みの例を紹介しましたが、with構文は通信処理、例えばデータベース管理ソフトと通信してSQLの実行結果を受け取る処理にも使えます。そして、PythonのMySQLドライバーと組み合わせれば、MySQLのデータベースから受け取ったデータを、with構文で使うことが可能です。
Pythonのwith構文でMySQLのデータベースに接続する方法
PythonでWebシステムを構築する場合、データベースへのアクセスが欠かせません。そして、Pythonでデータバースの値を簡潔に処理するには、with構文の利用がおすすめです。次から、データベースの操作をwith構文で書く方法を紹介します。
with構文はクラスを指定できる
先ほど、with構文の説明でファイルの読み込みを紹介しましたが、残念ながらそれと同じopen関数で、データベースに接続できる訳ではありません。with構文は、open関数の代わりにクラスを指定できます。そのため、データベース管理ソフトに接続してSQLを実行するクラスを作り、そのクラスをwith構文に指定することで、with構文でデータベースを利用します。
なお、MySQLのデータベースを使う場合、データベースを操作するためのSQLが必要です。さらに幾つものSQLを利用して、複数のテーブルに格納されたデータを活用するケースもあるでしょう。そのため、with句で指定するクラスでは、SQLを引数で指定できるように作ると良いでしょう。
with構文がデータベースへのアクセスに向いている理由
with構文で利用できるクラスには、次の3つのメソッドを宣言する必要があります。
__init__メソッド:クラスのインスタンス生成後に、それを初期化するために呼び出されるメソッド。
__enter__メソッド:クラスの呼び出しが成功した際に実行されるメソッド。自分のインスタンスを返す必要がある。
__exit__メソッド:クラスの呼び出しが成功した際に呼び出されることが保証されている、終了処理メソッド。
PythonからMySQLなどのデータベースにアクセスする際、必ず最初に接続処理があり、SQLを実行して結果を取得したら、接続を終了する処理も必要です。しかし、プログラムの構成によっては、終了処理を忘れがちです。しかし、with構文を使うことで、オブジェクトに定義された__exit__メソッドにより、確実に終了処理を実行できます。ぜひ、PythonからMySQLに接続するには、with構文を使ってください。
PythonでMySQLに接続するには
Pythonのバージョン3でMySQLに接続するには幾つか方法がありますが、今回はmysql-connector-pythonで解説します。なお、mysql-connector-pythonを利用するには、予めインストールしておく必要があるので注意してください。
mysql-connector-pythonのインストールコマンド
$pip install mysql-connector-python
(pipコマンドは、Python3に付属したコマンドで、pipではなくpip3がインストールされているシステムもあります。)
次に、with構文のオブジェクトに記述する、PythonからMySQLに接続する例を紹介します。なお、インストールしたmysql-connector-pythonを利用するため、import mysql.connectorで読み込んでおきましょう。
PythonからMySQLに接続する例 import mysql.connector def __init__(self): self.connect = mysql.connector.connect( db = "データベース名", host = "ホスト名", user = "MySQLアカウント名", passwd = "MySQLアカウントのパスワード", charset = "utf8")
まず、__init__メソッドは、最初に一度だけ実行される処理で、ここにMySQLに接続するための処理を書きます。そして、他のプログラム言語と同じように、MySQLに接続するには、データベース名、ホスト名、アカウント名、パスワードを指定します。なお、日本語を扱う場合は、キャラクターセットとして「utf8」を指定しておきましょう。
with構文で自動で接続を終了する処理
PythonでMySQLとの接続を終了するには、closeメソッドを実行します。これを、with構文に使用するオブジェクトの__exit__メソッドにこの接続の終了処理を記述すると、自動的に終了処理をやってくれます。次に、__exit__メソッドの例を紹介します。
__exit__メソッドの例 def __exit__(self, exception_type, exception_value, traceback): self.connect.close()
MySQLからwith構文でデータを取り出す例
次に。Pythonのwith構文を使い、MySQLのデータベースからデータを取得する例を紹介します。
#!/usr/bin/python3 # import mysql.connector class obj(): def __init__(self): self.conn = mysql.connector.connect( user = "www", password = "www-www", host = "localhost", database = "test", charset = "utf8") def __enter__(self): return self def call(self, sql): cur = self.conn.cursor() cur.execute(sql) return(cur.fetchall()) def __exit__(self, exception_type, exception_value, traceback): self.conn.close() with obj() as action: res = action.call("select * from mysqltest;") for row in res: out = "" for val in row: if out == "": out = str(val) else: out = out + "," + str(val) print(out)
この例では、with構文で使うオブジェクトに、sqlを実行するためのcallメソッドを作成し、sqlの実行結果を全て返しています。他の__init__メソッドや__enter__メソッド、__exit__メソッドは、それまでに説明したとおりです。そして、with構文を利用して取得したデータは、with構文内で処理し、csv形式に加工して出力しています。
まとめ
Pythonを使ったWebシステムが増えており、そのようなシステムではデータベースを活用しています。そのようなシステムでは、close処理を自動化できるwith構文を、ぜひ、活用してください。また、MySQLへの接続にオブジェクトを利用することで、それを使いまわすことも可能です。このように便利なPythonのwith構文を、うまく活用しましょう。