python3系でローカルのmysqlを操作する方法〜その1 mysqlへアクセス〜

Python
この記事は約6分で読めます。

いつもはdjangoからしかアクセスしないローカルのmysqlですが、今回はデータ分析で使うためのデータにpythonからアクセスしたかったので、記事にしてみました。

mysqlから取得したデータを最後はスプレッドシートにあげるところまでやるのが、今回のシリーズの流れです。

日頃mysql叩くだけなら、ターミナルから実行もしくはSequel proさんにお世話になるケースが多いですが、直接pythonコードでmysql叩けた方が便利なケースも増えると思いますので、暇な時にご参考に読んでみてください。

Advertisements

やりたいこと

ざっと、以下のようなことを実施していきたいと思います。

  1. python(pycharm環境)でmysqlへ接続
  2. sql文をpythonコード内に入れて、pythonでmysqlのデータを取得
  3. 取得したデータをcsvにしてsheetsAPIを使ってスプレッドシートへ書き込み

今回は1と2を実施していきます。3については、過去みてきたsheetsAPIの使い方も参考になりますので、過去記事リンクも以下に貼っておきます。

環境・install packageなどの前提条件

以下の前提で動作するようにしてあります。2系の記事は多くあったのですが、3系の記事って実はまだあんまり無いんですね。

OS:macOS Catalina
python: 3.7
mysqlclient: 1.4.6

mysqlclientのインストール

pip3にmysqlclientをインストしておいてください。pipでインストしてもらっても問題ありません。

//ターミナルで実行
pip3 install mysqlclient

mysqlclientがインストールできない時

たぶん、brew上にmysqlがインストールされていないケースかなぁと(初めてやられる方がエラーを起こすことをイメージしています。その他のケースもあるので悪しからず)。下記方法で直らない場合はググってください。

//ターミナルで実行
brew install mysql

実際のコード紹介

以下のコードでローカルmysqlにアクセスして、対象DB・テーブルからデータを5つ取得可能です。

#!/usr/bin/env/ python
# coding:utf-8

# CSV取り扱う関係
import io
# import csv

#表示関係
from pprint import pprint

# MySQL
import MySQLdb

def sql_to_csv():
    """MySQLでクエリー検索して、結果をもとに表示する
    """

    # クエリー結果の出力先ファイルオブジェクト->次回以降でCSVファイルに化けさせて、スプレッドシートに表示するためこの名表
    csvfile = io.StringIO()

    # MySQL に接続
    config = {
        'host': '127.0.0.1',
        'password': 'XXXXX', //mysqlへ接続するためのパスワード
        'user': 'root',
        'database': 'sale_data' //利用するDBの名前、今回は販売データを利用したのでDBName:sale_dataを利用
    }

    # configをアンパック
    cnx = MySQLdb.connect(**config)
    cursor = cnx.cursor()

    # SQL を投げる
  # DB内にcoupon_logというテーブルがあるので、そこから全データ取得して5件だけ取得
    cursor.execute("""
  SELECT * FROM coupon_log
  LIMIT 5
    """)

   #fetchallでデータを取得して、データを一行ずつcsvfileに書き込む
    rows = cursor.fetchall()
    if rows:
        for r in rows:
            csvfile.write(str(r))

    # MySQL への接続を切る
    cursor.close()
    cnx.close()

    # csvfileに一時保存されてるデータを取得、csvfileを閉じる
    csv_data = csvfile.getvalue()
    csvfile.close()

    return csv_data

if __name__=="__main__":
    data = sql_to_csv()
    pprint(data)

実行結果

実行すると以下のように表示されるかと思います。データの中身はみなさんがアクセスしたDBによりけりですが。

簡易コード解説

さて、一部ではありますが、mysqlへ接続するための基本的なお作法について説明していきます。

mysqlへ接続するためのconfigデータについて

コードだとこの部分の説明です。

# MySQL に接続
    config = {
        'host': '127.0.0.1',
        'password': 'XXXXX', //mysqlへ接続するためのパスワード
        'user': 'root',
        'database': 'sale_data' //利用するDBの名前、今回は販売データを利用したのでDBName:sale_dataを利用
    }
host :127.0.0.1って?

hostは127.0.0.1で指定しています。これは、ローカルループバックアドレスという物です。ローカルループバックアドレスとは、自分自身を指す特別IPのことであり、os内の直接のローカル環境に接続する時に利用するIPとでも覚えておいてもらえればと思います。

user

userはrootユーザを指定します。基本設定をごちゃごちゃいじっていない前提だと、rootユーザで特権アクセスしていることが一般的だと思います。

database

データベース名を指定します。データベース名がわからない方は、SHOW databases; をして探してください。基本的なmysqlコマンドは以下の記事にまとめてあります。

まとめ

今回はコードの説明はかなり端折りましたが、特段難しいことはしていないので、大丈夫かと思います。

ioがわからないかたもいるかもですが、pythonの標準モジュールで仮にデータを作成したい時に非常に有用ですので、リファレンス読んでもらえるといいかと思います。

次回以降で、
・mysqlのCRUD(クラッド)を一式pythonから行う方法
・取得データをcsv化して、スプレッドシートにupする方法
など紹介していきます。

コメント