MySQLのSELECT結果をヘッダー付きでCSV出力

SQLだけだとヘッダー情報がつけにくい

MySQLにてヘッダー情報をつけるには、UNIONでヘッダー情報をつけることができます。

mysql >
SELECT 'id', 'name', 'age' union
SELECT * FROM person
FROM item
INTO OUTFILE '/tmp/item.csv'
    FIELDS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"';

しかし、この方法では事前にテーブルの情報を知っている必要があります。具体的にはカラム名を知っていないと指定することができないということです。

Pythonでヘッダー情報も含めてCSV出力させる

使うもの

  • pymysql(MySQLクライアント)
  • pandas(簡単にCSV出力することができる)

それぞれをインストール

$ pip install pymysql
$ pip install pandas

コネクションの作成

import pymysql

connection = pymysql.connect(host='localhost',
                             user='user',
                             port='3306',
                             password='password',
                             database='test',
                             cursorclass=pymysql.cursors.DictCursor)
cursor = connection.cursor()

CSV出力

import os
import pandas as pd

if os.path.exists('outputs') is False:
    os.mkdir('outputs')

cursor.execute('show tables')
result = cursor.fetchall()
tables = [obj['Tables_in_analysis'] for obj in result]

for table in tqdm(tables):
    sql = f'show columns from {table}'
    cursor.execute(sql)
    result = cursor.fetchall()
    fields = [obj['Field'] for obj in result]

    sql = f'select {",".join(fields)} from {table}'
    cursor.execute(sql)
    df = pd.DataFrame(cursor.fetchall(), columns=fields)
    df.to_csv(f'outputs/{table}.csv', index=False)

ポイントはshow tablesshow columns from <table name>でテーブル名やカラム名を取ってくるところです。

コメント

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