【Python】MySQLからCSVファイルへデータを出力する

■概要

MySQLに格納しているデータについて、全量取得する。
さらに、取得したデータをCSVファイルに出力する。

MySQL
DBデータ
MySQL…
実装する処理
実装する処理
ID,data1,data2,data3
1,a,aa,aaa
2,b,bb,bbb
3,c,cc,ccc
ID,data1,data2,data3…
test_output_csv_table
ID
ID
data1
data1
data2
data2
data3
data3
1
1
a
a
aa
aa
aaa
aaa
2
2
b
b
bb
bb
bbb
bbb
3
3
c
c
cc
cc
ccc
ccc
Text is not SVG – cannot display

なお、接続するDB情報は、以下の通り。

項目名
接続ユーザ名user001
接続パスワードaaa
ホスト127.0.0.1
ポート3306
スキーマtest_schema
テーブルtest_output_csv_table

■フローチャート

本ツールにおける処理の流れに関して、フローチャートを以下に示す。

▼メイン処理

メイン処理のフローチャートを以下に示す。

開始
開始
mysqlからデータをcsvに出力する関数
mysqlからデータをcsvに出力する関数
終了
終了
Text is not SVG – cannot display

▼mysqlからデータをcsvに出力する関数

mysqlからデータをcsvに出力する関数のフローチャートを以下に示す。

開始
開始
Mysql接続・実行クラスのインスタンス
Mysql接続・実行クラスのインスタンス
Mysqlに接続する関数実行
Mysqlに接続する関数実行
テーブルからデータを取得するクラスのインスタンス
テーブルからデータを取得するクラスのインスタンス
テーブルからデータを取得する関数実行
テーブルからデータを取得する関数実行
Keyを取得する関数実行
Keyを取得する関数実行
現在時刻取得
現在時刻取得
出力するファイル名をセット
出力するファイル名をセット
出力ファイルを追記モードでオープン
出力ファイルを追記モードでオープン
辞書→csvライブラリの呼び出し
辞書→csvライブラリの呼び出し
ヘッダーを出力
ヘッダーを出力
データ部を出力
データ部を出力
終了
終了
csvファイル
csvファイル
Text is not SVG – cannot display

▼Keyを取得する関数

Keyを取得する関数のフローチャートを以下に示す。

開始
開始
返却用リストの初期化
返却用リストの初期化
リストデータ分繰り返し
リストデータ分繰り返し
辞書データ分繰り返し
辞書データ分繰り返し
返却用リストにKeyが存在
返却用リストにKeyが存在
返却用リストにKeyを追加
返却用リストにKeyを追加
存在していない
存在していない
その他
その他
返却用リストを返す
返却用リストを返す
終了
終了
Text is not SVG – cannot display

▼Mysql接続・実行クラス

Mysql接続・実行クラスのフローチャートを以下に示す。

 Mysql接続・実行クラス
 Mysql接続・実行クラス
コンストラクタ
コンストラクタ
開始
開始
コネクション初期化
コネクション初期化
終了
終了
Mysqlに接続する関数
Mysqlに接続する関数
開始
開始
 try
 try
mysqlに接続
mysqlに接続
except
except
例外エラー出力
例外エラー出力
例外エラー
例外エラー
コンソール
コンソール
finally
finally
コネクションを返す
コネクションを返す
終了
終了
Text is not SVG – cannot display

▼テーブルからデータを取得するクラス

テーブルからデータを取得するクラスのフローチャートを以下に示す。

テーブルからデータを取得するクラス
テーブルからデータを取得するクラス
コンストラクタ
コンストラクタ
開始
開始
取得結果初期化
取得結果初期化
終了
終了
Mysqlに接続する関数
Mysqlに接続する関数
開始
開始
 try
 try
SQL実行
SQL実行
except
except
例外エラー出力
例外エラー出力
例外エラー
例外エラー
コンソール
コンソール
finally
finally
コネクションを返す
コネクションを返す
終了
終了
出力形式を辞書型
出力形式を辞書型
結果を格納
結果を格納
テーブル
テーブル
Text is not SVG – cannot display

■サンプルコード

本ツールで実装したサンプルのソースコードを以下に示す。

・output_csv_from_mysql.py

import csv
from datetime import datetime

from connect_mysql import ConnectMysql, SelectData


# 出力ディレクトリパス
OUTPUT_DIR = './output_dir/'


# Keyを取得する関数
def get_dict_keys(list_data):
    # 返却用リストの初期化
    dict_keys = []

    # リストデータ分繰り返し
    for data in list_data:
        # 辞書データ分繰り返し
        for key in data.keys():
            # 返却用リストにKeyが存在していない場合
            if key not in dict_keys:
                # 返却用リストにKeyを追加
                dict_keys.append(key)

    # 返却用リストを返す
    return dict_keys


# mysqlからデータをcsvに出力する関数
def output_csv_from_mysql():
    # Mysql接続・実行クラスのインスタンス
    sql_connect = ConnectMysql()
    # Mysqlに接続する関数実行
    connect_info = sql_connect.connector_mysql()

    # テーブルからデータを取得するクラスのインスタンス
    select_user = SelectData()
    # テーブルからデータを取得する関数実行
    result_datas = select_user.select_data(connect_info)

    # Keyを取得する関数実行
    filed_names = get_dict_keys(result_datas)

    # 現在時刻取得
    now_date = datetime.now()

    # 出力するファイル名をセット
    output_file_path = OUTPUT_DIR + now_date.strftime('%Y%m%d_%H%M%S') + '.csv'

    # 出力ファイルを追記モードでオープン
    with open(output_file_path, 'a') as output_file:
        # 辞書→csvライブラリの呼び出し
        writer = csv.DictWriter(output_file, fieldnames=filed_names)
        # ヘッダーを出力
        writer.writeheader()
        # データ部を出力
        writer.writerows(result_datas)


# メイン処理
if __name__ == '__main__':
    # mysqlからデータをcsvに出力する関数実行
    output_csv_from_mysql()

・connect_mysql.py

import mysql.connector

# MySQLの接続情報
MYSQL_USER = 'user001'
MYSQL_PASSWORD = 'aaa'
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = '3306'
MYSQL_DATABASE = 'test_schema'
MYSQL_AUTH = 'mysql_native_password'

# SQL文
SQL_SELECT_QUERY = 'SELECT * FROM test_output_csv_table;'


# Mysql接続・実行クラス
class ConnectMysql:
    def __init__(self):
        self.con = None

    # Mysqlに接続する関数
    def connector_mysql(self):
        try:
            # mysqlに接続
            self.con = mysql.connector.connect(
                user=MYSQL_USER,
                password=MYSQL_PASSWORD,
                host=MYSQL_HOST,
                port=MYSQL_PORT,
                database=MYSQL_DATABASE,
                auth_plugin=MYSQL_AUTH
            )

        # 例外処理
        except Exception as e:
            print('connector_mysql: 例外エラー: ', e)

        finally:
            return self.con


# テーブルからデータを取得するクラス
class SelectData():
    def __init__(self):
        self.rows = None

    # テーブルからデータを取得する関数
    def select_data(self, con):
        # 出力形式は辞書型
        self.cursor = con.cursor(dictionary=True)
        try:
            # SQL実行
            self.cursor.execute(SQL_SELECT_QUERY)

            # 検索結果格納
            self.rows = self.cursor.fetchall()

        # 例外処理
        except Exception as e:
            print('select_data: 例外エラー: ', e)

        finally:
            self.cursor.close()
            return self.rows

■実行結果

本ツールを実行したCSVファイルの出力結果を以下に示す。

ID,data1,data2,data3
1,a,aa,aaa
2,b,bb,bbb
3,c,cc,ccc

■参考

本ツールを作成するにあたり、参考とさせていただいたURLを以下に示す。

タイトルとURLをコピーしました