Contents
MySQL接続ドライバ比較
FlaskアプリケーションでMySQLを扱う際には、mysql-connector-pythonとpymysqlが主流です。それぞれの特徴や使用上の注意点を以下にまとめます。
| 項目 | mysql-connector-python | pymysql |
|---|---|---|
| 提供元 | Oracle (公式ドライバ) | Pythonコミュニティ |
| 接続メソッド | mysql.connector.connect() |
pymysql.connect() |
| 自動再接続機能 | ✅ reconnect() メソッドあり |
❌ 無し(要カスタム実装) |
| パフォーマンス | 一般的にやや重め | 高速、軽量 |
注意:
mysql-connector-pythonのreconnect()メソッドは、pymysqlでは利用できないため、ドライバごとの処理が必要です。
接続情報のセキュア管理方法
接続情報をコードに直接記述するとリポジトリへの機密情報漏洩リスクがあります。以下に安全な実装方法を解説します。
環境変数と.envファイルの活用
- 環境変数使用法
リスト形式で接続情報を取得する方法です。
python
import os
host = os.getenv("MYSQL_HOST")
user = os.getenv("MYSQL_USER")
password = os.getenv("MYSQL_PASSWORD")
database = os.getenv("MYSQL_DATABASE")
.envファイルの構成例
ソースコードから接続情報を分離するには、.gitignoreで管理する必要があります。
# .env
MYSQL_HOST=localhost
MYSQL_USER=your_username
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=your_database
- python-dotenvによる読み込み
.envファイルをPythonコードから読み込むには、以下のようにします。
python
from dotenv import load_dotenv
import os
load_dotenv()
host = os.getenv("MYSQL_HOST")
user = os.getenv("MYSQL_USER")
重要: 環境変数を使用する際は、
.gitignoreに.envを追加してリポジトリに含めないよう注意してください。
エラーハンドリングの実装方法
MySQL接続時に発生するエラーを適切に対処することが重要です。以下は具体的な対応例とエラーメッセージの一覧です。
例外ハンドリングコード(共通化)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
try: conn = pymysql.connect( host="localhost", user=os.getenv("MYSQL_USER"), password=os.getenv("MYSQL_PASSWORD"), db=os.getenv("MYSQL_DATABASE") ) cursor = conn.cursor() cursor.execute("SELECT * FROM users") except (pymysql.MySQLError, mysql.connector.Error) as err: print(f"接続エラー: {err}") finally: if 'conn' in locals() and conn.is_connected(): cursor.close() conn.close() |
エラーメッセージの例
| エラータイプ | メッセージ例 | 対応処置 |
|---|---|---|
| 接続失敗 | Access denied for user 'your_username'@'localhost' |
認証情報を確認する |
| データベース未存在 | Unknown database 'your_database' |
データベース名を再確認 |
| ネットワークエラー | Lost connection to MySQL server at 'reading initial communication packet' |
ドライバの再接続ロジックを実装 |
Lost connection対策と自動再接続
ネットワークの不安定やサーバー側のトラブルで「Lost connection」が発生する場合があります。以下に自動再接続の方法を解説します。
自動再接続ロジック(mysql-connector限定)
|
1 2 3 4 5 6 7 8 9 |
def reconnect(conn, cursor): try: if not conn.is_connected(): conn.reconnect() print("自動再接続が完了しました") cursor = conn.cursor() except Exception as e: print(f"再接続に失敗: {e}") |
注意:
pymysqlでは、この方法は使用不可です。pymysqlではカスタム実装が必要です。
タイムアウト設定の重要性
MySQL側で接続タイムアウトを設定することで、エラー発生時の待機時間を短縮できます。
|
1 2 |
SET GLOBAL connect_timeout = 30; |
Docker環境でのネットワーク構成とトラブルシューティング
Dockerを使用する際には、ポートマッピングやネットワークの設定が接続に影響します。以下に具体的な手順と確認項目を紹介します。
ポートマッピングの正しい設定方法
docker-compose.ymlでMySQLコンテナを構築する際は、ポートマッピングを行います。
yaml
services:
db:
image: mysql:8.0
ports:
- "3307:3306"
environment:
MYSQL_ROOT_PASSWORD: rootpass
|
1 2 3 4 5 6 7 |
app: build: . ports: - "5000:5000" depends_on: - db |
- ホスト名としてコンテナ名を使う
Flaskアプリケーション側では、MySQLコンテナのサービス名(例:db)を使用します。
python
conn = pymysql.connect(
host="db", # コンテナ名で指定
user=os.getenv("MYSQL_USER"),
password=os.getenv("MYSQL_PASSWORD"),
db=os.getenv("MYSQL_DATABASE")
)
-
ネットワーク確認コマンド
接続エラーが発生した際は、以下のコマンドで状態を確認してください。 -
docker ps: コンテナ起動状況の確認 docker network inspect: ネットワーク構成の検査ping db: MySQLコンテナにアクセス可能かテスト
補足:ドライバ選択と環境変数のベストプラクティス
- ドライバ選択ガイド:
- 簡単な接続が必要な場合 →
pymysql(軽量) -
公式サポートを重視する場合 →
mysql-connector-python(MySQL公式) -
環境変数の命名規則:
例:MYSQL_HOST,MYSQL_USER,MYSQL_PASSWORDなど、すべて大文字で統一。
結論とまとめ
FlaskとMySQL接続を安定稼働させるには、以下がポイントです:
- ドライバ依存の処理(例: 自動再接続)に注意
- 安全な環境変数管理を行う
- エラーハンドリングを適切に対応
- Dockerネットワーク構成を明確に設定
本記事で紹介した知識とコードを参考にして、あなたのプロジェクトでも確実な接続実装を目指してください。