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 tables
とshow columns from <table name>
でテーブル名やカラム名を取ってくるところです。
コメント