LoginSignup
3
4

More than 3 years have passed since last update.

毎日SQLを手で実行して結果をエクセルに貼り付けて...なんてことしていませんか? Pythonなら全自動でできます。

Last updated at Posted at 2020-07-13

Pythonを最近勉強し始めたのですが、
PythonでSQL実行して結果をエクセル出力すると楽になると思ったのでまとめました。

コード50行くらいです。

やること

  1. PythonでSQLフォルダのSQLを順に実行
  2. SQL実行結果をSQLと同じファイル名でエクセル出力
  3. エクセルをZIPにまとめる
  4. ファイルサーバに置く

試した環境

  • 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()

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4