はじめに
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 で出力するコードです。
- glob関数を使用して、拡張子が”.sql”であるファイルを取得する
- 取得したファイルのパスから、ファイルに記載された SQL を読み込み実行する
- SQL 実行結果から CSV ファイルを作成する
- CSV ファイルを各 SQL ファイルと同じ名前で、results ディレクトリ配下に保存する
- 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 で出力する方法をまとめました。
この記事がどなたかの参考になれば幸いです。
コメント