SQLAlchemyとFlask-SQLAlchemyの使い方ガイド

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. データベースのマイグレーション

マイグレーションを使用してデータベースの変更を簡単に管理できます。

手順

  1. Flask-Migrateをインストール:bashコードをコピーするpip install Flask-Migrate
  2. Flaskアプリケーションに設定を追加:pythonコードをコピーするfrom flask_migrate import Migrate migrate = Migrate(app, db)
  3. マイグレーションリポジトリの作成:bashコードをコピーするflask db init
  4. モデル変更に基づくマイグレーションファイルの作成:bashコードをコピーするflask db migrate -m "Add user table"
  5. データベースに変更を適用: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'

対応手順:

  1. SQLiteでalembic_versionテーブルを削除:bashコードをコピーするsqlite3 data.sqlite drop table alembic_version;
  2. 再度マイグレーションを実行:bashコードをコピーするflask db upgrade

8. まとめ

Flask-SQLAlchemyは、Flaskアプリケーションのデータベース操作を効率化し、簡単かつ強力なデータベース管理機能を提供します。このガイドを参考に、実践的なデータベース操作を学びましょう!

参考記事

SQLite3まとめ #SQL - Qiita

#基本コマンドSQLiteの起動や終了に必要な基本的なコマンドsqlite3 デ…
qiita.com

まとめ

Flaskアプリ開発の全てがここに!アプリ構成の全てはこちらをご覧ください!

Flask入門: Webアプリケーション開発の基礎ガイド

Webアプリケーションとは Webアプリケーションの定義 Webアプリケーション…
benelop.jp