Pythonを最近勉強し始めたのですが、
PythonでSQL実行して結果をエクセル出力すると楽になると思ったのでまとめました。
コード50行くらいです。
やること
- PythonでSQLフォルダのSQLを順に実行
- SQL実行結果をSQLと同じファイル名でエクセル出力
- エクセルをZIPにまとめる
- ファイルサーバに置く
試した環境
- Python3.8
- jupyter-notebook(Anacondaから)
- mysql
準備
- 実行したいSQLを〜.sqlの名前でフォルダにまとめて保存しておく
- 一部のPythonライブラリをimportしておく
ソース/実行
import mysql.connector
import datetime
import glob
import os
import pandas as pd
import csv
import pyminizip
import pathlib
import shutil
def exec():
# 1. PythonでSQL実行 ------------------------------------
# DB接続
conn = mysql.connector.connect(
host = 'ホスト',
port = 'ポート',
user = 'ユーザ',
password = 'パスワード',
database = 'データベース'
)
# SQLファイル取得
os.chdir("SQLファルダ")
sql_file_list = glob.glob("*.sql")
# フォルダ作成
now = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
os.mkdir(now)
# SQL実行
for sql_file in sql_file_list:
print(sql_file)
with open(sql_file, 'r') as f:
sql_query = f.read()
df = pd.read_sql_query(sql_query, con=conn)
# 2. 結果をエクセルで出力 ------------------------------------
# エクセル出力の場合
df.to_excel(now + "\\" + sql_file.replace('.sql', '.xlsx'), sheet_name=sql_file.replace('.sql', ''), index=False)
# CSV出力の場合
df.to_csv(now + "\\" + sql_file.replace('.sql', '.csv'), encoding="utf-8_sig", quoting=csv.QUOTE_NONNUMERIC, index=False)
os.chdir(now)
# 個別の編集があればここでやる
# 結果ファイル取得
result_file_list = glob.glob("*.xlsx")
# 3. ZIPにする ------------------------------------
# 結果ファイル圧縮(日本語ファイル名非対応)
file_path = []
for i in range(len(result_file_list)):
file_path.append('\\')
pyminizip.compress_multiple(result_file_list,file_path, now + '.zip','pass',0)
# 4. ファイルサーバに置く ------------------------------------
# 結果ファイルアップロード
share = pathlib.WindowsPath(r'ファイルサーバ' + now + '.zip')
shutil.copyfile(now + '.zip', share)
# 切断
conn.close()
# 実行
exec()