Contents
FlaskとMySQLの連携手順を解説|Docker環境構築からコード実装まで
FlaskアプリケーションとMySQLデータベースを接続する際、Dockerでの環境構築は非常に効率的です。本記事では、Docker ComposeでMySQLコンテナを構築し、Flaskアプリケーション内でデータベース操作を行う一連の手順を具体的に解説します。読者の中には「Dockerとの連携が不安」「セキュリティ対策が分からない」という疑問を持つ方もいるでしょう。この記事を読み終えると、MySQLとの連携環境構築からCRUD操作までスムーズに行えるようになります。
DockerでMySQLを構築する手順
Docker Composeを使用することで、MySQLコンテナの設定は非常にシンプルになります。以下に具体的な手順を示します。
セキュリティとバージョン管理の注意点
MySQLイメージやライブラリ依存関係の最新性には常に気を配りましょう。
mysql:8.0は現在の代表的なバージョンですが、将来的に互換性がなくなる可能性があります。定期的に公式ドキュメントで確認してください。
Docker Composeファイルの作成
MySQLコンテナを起動するには、docker-compose.ymlを作成します。このファイルでは、ポート設定や環境変数を指定できます。以下のコード例を参考にしてください。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
version: '3.8' services: db: image: mysql:8.0 container_name: mysql_db environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: flask_db MYSQL_USER: flask_user MYSQL_PASSWORD: flask_pass ports: - "3306:3306" volumes: - db_data:/var/lib/mysql networks: - app_network volumes: db_data: networks: app_network: |
この設定では、MySQLのルートパスワードをrootpassとして定義し、Flaskアプリケーションが使用するデータベース名やユーザー情報も指定しています。ポート3306をホスト側とコンテナ内で同じにすることで、外部から接続が可能になります。
MySQLコンテナの起動確認
Docker Composeファイルを作成したら、以下のコマンドでコンテナを起動します。
|
1 2 |
docker-compose up -d |
起動後の確認手順
- MySQLサーバーの接続テスト:
mysql-clientを使用して接続を確認しましょう。
|
1 2 |
docker run --rm mysql:8.0 mysql -h localhost -u flask_user -pflask_pass -e "SHOW DATABASES;" |
このコマンドでデータベース一覧が表示されれば、MySQLコンテナの構築は完了です。
- エラーメッセージ対応:
Access deniedなどが出た場合は、パスワードやユーザー名を確認してください。
FlaskアプリケーションでのMySQL接続準備
Flaskアプリケーションでは、pymysqlやflask-mysqldbを使用してMySQLに接続します。以下に必要な手順を紹介します。
必要ライブラリのインストールと比較表
選択肢
flask-mysqldb: データベース設定を簡潔に管理できます。pymysql: 低レイヤーなSQL操作が必要な場合に利用。
| ライブラリ名 | 特徴 | 導入コマンド |
|---|---|---|
flask-mysqldb |
Flaskと連携しやすい | pip install flask-mysqldb |
pymysql |
SQL操作が自由度が高い | pip install pymysql |
DB接続設定コードの実装
MySQLと接続するためには、以下のようなコードをFlaskアプリケーションに記述します。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
from flask import Flask from flask_mysqldb import MySQL app = Flask(__name__) # MySQL設定 app.config['MYSQL_HOST'] = 'localhost' app.config['MYSQL_USER'] = 'flask_user' app.config['MYSQL_PASSWORD'] = 'flask_pass' app.config['MYSQL_DB'] = 'flask_db' mysql = MySQL(app) |
このコードでは、app.configにMySQLの接続情報を設定し、MySQL(app)で初期化しています。これにより、Flaskアプリケーション内から簡単にデータベース操作が可能になります。
注意事項:
- 実際に運用する際は、セキュリティ対策として
.envファイルで環境変数を使用してください(後述)。 - パスワードなど機密情報はコード内でハードコーディングしないようにしましょう。
FlaskとMySQLの連携コード構築
MySQLとの連携を確立したら、モデルクラスやルーティングを実装することで具体的な操作を行うことができます。
ORMによるデータベース操作の導入
Flask-Mysqldbでは直接SQLクエリを発行することも可能ですが、ORMを使用するとデータベース操作がシンプルになります。以下にflask-sqlalchemyを使った簡単なモデル例を示します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from flask_sqlalchemy import SQLAlchemy app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://flask_user:flask_pass@localhost/flask_db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100), nullable=False) email = db.Column(db.String(150), unique=True, nullable=False) def __repr__(self): return f'<User {self.name}>' |
このコードでは、Userモデルを定義し、データベースに保存される項目(id、name、email)を設定しています。また、__repr__メソッドでオブジェクトの文字列表現を指定します。
導入時の手順
pip install flask-sqlalchemyでインストール。- データベースURIを正しく設定する。
- モデルクラスを定義し、CRUD操作に使用する。
CRUD操作の実装サンプル
Flaskアプリケーション内でCRUD(作成・読み取り・更新・削除)機能を実装するには、以下のエンドポイントを作成します。
Create機能の実装
新しいユーザーをデータベースに追加するPOST /usersエンドポイントです。以下のようにリクエストボディからデータを受け取って保存できます。
|
1 2 3 4 5 6 7 8 9 10 |
from flask import request @app.route('/users', methods=['POST']) def create_user(): data = request.get_json() new_user = User(name=data['name'], email=data['email']) db.session.add(new_user) db.session.commit() return {'message': 'User created successfully'}, 201 |
このコードでは、request.get_json()で送信されたデータを取得し、Userモデルのインスタンスを作成して保存します。
実装時のポイント:
- バリデーション(例: 電子メール形式チェック)が必要な場合は、追加ロジックを挿入。
- エラーハンドリングも忘れずに実装してください。
セキュリティ対策と環境変数の活用
アプリケーション内でDB接続情報(ユーザー名やパスワード)を硬编码するとセキュリティリスクがあります。それを避けるために、.envファイルを使用して情報を管理します。
.envファイルの作成と設定例
プロジェクトルートに.envを作成し、以下のように環境変数を定義します。
|
1 2 3 4 5 |
MYSQL_HOST=localhost MYSQL_USER=flask_user MYSQL_PASSWORD=flask_pass MYSQL_DB=flask_db |
このようにしてDB接続情報は外部から読み込むことで、セキュリティ対策が強化されます。
セキュアな接続設定の実装手順
.envファイルを読み込むには、python-dotenvライブラリを使用します。以下のようにインストール・初期化してください。
|
1 2 |
pip install python-dotenv |
|
1 2 3 4 5 6 7 8 |
from dotenv import load_dotenv import os load_dotenv() app.config['MYSQL_HOST'] = os.getenv('MYSQL_HOST') app.config['MYSQL_USER'] = os.getenv('MYSQL_USER') # 他の設定も同様に読み込む |
このようにすることで、DB接続情報はコード内に含まれず、外部ファイルで管理できるようになります。
導入のメリット:
- デプロイ時に秘密情報を漏らさない。
- 環境ごとの設定(開発・本番)を柔軟に切り替え可能。
動作確認と今後の拡張案
構築したアプリケーションが正しく動作するかを確認し、今後の拡張性についても検討しましょう。
起動テストの手順とトラブルシューティング
Dockerコンテナを起動し、Flaskアプリケーションを実行してアクセスします。以下のコマンドで起動できます。
|
1 2 3 |
docker-compose up -d python app.py |
ブラウザでの確認
http://localhost:5000/usersにアクセスすると、ユーザーの一覧が表示されるはずです。- エラー処理: パスワードや接続情報のミスなどがあれば、コンテナログ(
docker-compose logs)を確認してください。
今後の拡張可能性と改善点
提案事項
- 認証機能(JWTやOAuth)の追加。
- データベース操作にトランザクションを導入。
- ロギングの整備: アプリケーションの動作状況を可視化する。
- Docker Composeの拡張: RedisやNginxなどのコンテナを追加。
改善例
flask-sqlalchemyではなく、より柔軟なORM(例: SQLAlchemy Core)を使用。- Dockerイメージのバージョン管理に
latestタグではなく、固定バージョンで指定する(例:mysql:8.0.32)。
まとめ
本記事では、FlaskアプリケーションとMySQLデータベースをDocker環境で連携する一連の手順について解説しました。具体的には以下をカバーしています:
- Docker ComposeでのMySQLコンテナ構築
- pymysqlやflask-mysqldbのインストールと設定
- Flaskアプリケーション内でのDB接続コード実装
- CRUD機能のエンドポイント設計
- セキュリティ対策として環境変数の活用
これらを参考に、自らDockerでFlaskとMySQLの連携環境を作成し、データベース操作を試してみてください。実践することで理解が深まり、開発効率も向上します。