バナー画像

プログラム言語の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構文を、うまく活用しましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。