Python で 複数の外部 SQL ファイルを実行する

IT

はじめに

Python で複数の SQL ファイルを読み込んで実行する方法をまとめます。
本記事では、実行した結果を CSV で出力して保存します。

対象者

この記事は下記のような人を対象にしています。

  • Python で SQL ファイルを読み込んで実行したい人
  • SQL の実行結果を CSV で保存したい人

環境

以下が今回の環境です。DB は MySQL を使用します。

$ python -V
Python 3.7.10
$ pip list | grep PyMySQL
PyMySQL               1.0.2

$ mysql --version
mysql  Ver 8.0.29 for Linux on x86_64 (MySQL Community Server - GPL)

サンプルコード

データベース接続情報は.python-dotenvモジュールを利用して読み込みます。
.envファイルを作成し、必要な情報を記載します。

user=root
password=mysql_password
host=localhost
port=33060
database=pets

以下が、複数の SQL ファイルを読み込んで結果を CSV で出力するコードです。

  1. glob関数を使用して、拡張子が”.sql”であるファイルを取得する
  2. 取得したファイルのパスから、ファイルに記載された SQL を読み込み実行する
  3. SQL 実行結果から CSV ファイルを作成する
  4. CSV ファイルを各 SQL ファイルと同じ名前で、results ディレクトリ配下に保存する
  5. 2 ~ 4 を SQL ファイルの数だけ繰り返す
import glob
import os

from dotenv import load_dotenv
import pymysql

load_dotenv()

def get_connection():
    connection = pymysql.connect(
        user = os.environ.get('user'),
        password = os.environ.get('password'),
        host = os.environ.get('host'),
        port = int(os.environ.get('port')),
        database = os.environ.get('database'),
        charset = 'utf8mb4',
        cursorclass = pymysql.cursors.DictCursor,
        )
    return connection

def get_query(query_file_path):
    with open(query_file_path, 'r', encoding='utf-8') as f:
        query = f.read()
    return query

with get_connection() as connection:
    with connection.cursor() as cursor:
        query_file_paths = glob.glob('sql/*.sql')
        for query_file_path in query_file_paths:
            query = get_query(query_file_path)
            cursor.execute(query)
            rows = cursor.fetchall()
            
            with open(f'./results/{os.path.splitext(os.path.basename(query_file_path))[0]}.csv', 'w') as f:
                for row in rows:
                    csv = ''
                    for value in row.values():
                        csv = csv + str(value) + ','
                    f.write(csv[:-1] + '\n')

おわりに

本記事では、Python で複数の SQL ファイルを読み込み CSV で出力する方法をまとめました。
この記事がどなたかの参考になれば幸いです。

参考

コメント