目次
1. SQLAlchemyとは?
SQLAlchemyは、Python向けの強力なORM(Object-Relational Mapping)ライブラリで、オブジェクト指向プログラミングとリレーショナルデータベースの橋渡しをします。
これにより、SQL文を直接記述せず、Pythonのオブジェクト指向的な方法でデータベースを操作可能になります。
ORMの主な特徴
- クラスとテーブルの対応: Pythonのクラスとデータベースのテーブルをマッピング。
- 属性とカラムの対応: オブジェクトの属性をデータベースのカラムにマッピング。
- SQLの抽象化: プログラムコード内でSQL操作を簡潔に記述可能。
2. Flask-SQLAlchemyとは?
Flask-SQLAlchemyは、Flaskアプリケーションに特化したSQLAlchemyの拡張版で、以下のような特徴を持ちます:
特徴 | Flask-SQLAlchemy | 通常のSQLAlchemy |
---|---|---|
目的 | Flaskとの簡単な統合 | より汎用的なORMツール |
機能範囲 | 必要十分な機能を提供 | 高度な機能もサポート |
学習コスト | 低い | 高い(高度な設定が必要) |
3. Flask-SQLAlchemyの始め方
インストール
以下のコマンドでFlask-SQLAlchemyをインストールします:
pip install -U Flask-SQLAlchemy
データベースモデルの作成
以下のコードで、ユーザーモデル(User
)を作成します:
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
db = SQLAlchemy()
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), index=True)
password = db.Column(db.String(128))
def __init__(self, email, username, password):
self.email = email
self.username = username
self.password = password
カラムのオプション解説
primary_key
: レコードを一意に識別する主キー。unique=True
: 重複する値を禁止。index=True
: 検索可能なインデックスを作成。nullable=False
: 空値を許容しない。
4. データベースのマイグレーション
マイグレーションを使用してデータベースの変更を簡単に管理できます。
手順
- Flask-Migrateをインストール:bashコードをコピーする
pip install Flask-Migrate
- Flaskアプリケーションに設定を追加:pythonコードをコピーする
from flask_migrate import Migrate migrate = Migrate(app, db)
- マイグレーションリポジトリの作成:bashコードをコピーする
flask db init
- モデル変更に基づくマイグレーションファイルの作成:bashコードをコピーする
flask db migrate -m "Add user table"
- データベースに変更を適用:bashコードをコピーする
flask db upgrade
5. CRUD操作
Flask-SQLAlchemyでのCRUD(作成、読み取り、更新、削除)操作の例です。
データの作成(CREATE)
new_user = User(email="example@example.com", username="example_user", password="secure_password")
db.session.add(new_user)
db.session.commit()
データの読み取り(READ)
user = db.session.execute(db.select(User).filter_by(username="example_user")).scalar_one()
データの更新(UPDATE)
with app.app_context():
# 既存のレコードを取得
user = User.query.filter_by(username="example_user").first()
if user:
# ユーザー名を更新
user.username = "updated_user"
# 更新を保存
db.session.commit()
print(f"ユーザー名が更新されました: {user.username}")
データの削除(DELETE)
db.session.delete(user)
db.session.commit()
6. テーブル間のリレーションシップ
親テーブルと子テーブルの定義
以下の例では、1人のユーザーが複数のアイテムを持つ「1対多」の関係を設定します。
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
items = db.relationship('Item', backref='user', lazy='dynamic')
class Item(db.Model):
__tablename__ = 'items'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
リレーション設定のポイント
db.relationship
: 親テーブルに子テーブルへのリンクを追加。backref
: 双方向アクセスを有効化。
7. トラブルシューティング
マイグレーションエラーの解消例
エラー: Can't locate revision identified by 'bc362f9981ac'
対応手順:
- SQLiteで
alembic_version
テーブルを削除:bashコードをコピーするsqlite3 data.sqlite drop table alembic_version;
- 再度マイグレーションを実行:bashコードをコピーする
flask db upgrade
8. まとめ
Flask-SQLAlchemyは、Flaskアプリケーションのデータベース操作を効率化し、簡単かつ強力なデータベース管理機能を提供します。このガイドを参考に、実践的なデータベース操作を学びましょう!
参考記事
まとめ
Flaskアプリ開発の全てがここに!アプリ構成の全てはこちらをご覧ください!