Flask-SQLAlchemy入門 – モデル定義とデータベース操作の基本

Flask-SQLAlchemy入門 – モデル定義とデータベース操作の基本

Flaskでデータベースを扱う際、Flask-SQLAlchemyは非常に便利な拡張機能です。この記事では、Flask-SQLAlchemyの基本的な使い方 (モデル定義、データベース操作) について解説します。対象読者は、FlaskやSQLAlchemyの初心者の方です。

Flask-SQLAlchemyとは

Flask-SQLAlchemyは、FlaskでSQLAlchemyを簡単に使えるようにする拡張機能です。

  • SQLAlchemyとは: PythonのORMライブラリです。
  • ORM (Object-Relational Mapper) とは: オブジェクトとリレーショナルデータベースのデータをマッピングする技術です。

ORMを使うことで、Pythonのコードでデータベースを操作できるようになり、SQLを直接書く必要が減ります。

環境構築

まずは、必要なパッケージをインストールしましょう。


pip install Flask Flask-SQLAlchemy psycopg2-binary python-dotenv

次に、`.env` ファイルを作成し、データベース接続情報を設定します。以下はPostgreSQLの例です。


DATABASE_URL=postgresql://ユーザー名:パスワード@ホスト名:ポート番号/データベース名

`.env` ファイルから環境変数を読み込むには、次のようにします。


import os
from dotenv import load_dotenv

load_dotenv()

# 環境変数の使用例
database_url = os.getenv('DATABASE_URL')

モデル定義

Flask-SQLAlchemyでは、`db.Model` を継承してモデルクラスを定義します。


from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Memo(db.Model):
    """
    メモを表すモデルクラス。

    Attributes:
        id (int): メモの一意なID。主キー。
        content (str): メモの内容。2000字以内。
        created_at (datetime): メモの作成日時。自動的に現在時刻が設定される。
        updated_at (datetime): メモの更新日時。作成時と更新時に自動的に現在時刻が設定される。

    Methods:
        __repr__(self): メモオブジェクトを文字列で表現する。デバッグ用。
    """
    id = db.Column(
        db.Integer,  # 整数型
        primary_key=True  # 主キー
    )
    content = db.Column(
        db.String(2000),  # 2000字以内の文字列
        nullable=False  # NULLを許可しない
    )
    created_at = db.Column(
        db.DateTime,  # 日時型
        server_default=db.func.now()  # デフォルト値は現在時刻
    )
    updated_at = db.Column(
        db.DateTime,  # 日時型
        server_default=db.func.now(),  # デフォルト値は現在時刻
        onupdate=db.func.now()  # 更新時に現在時刻を自動更新
    )

    def __repr__(self):
        """
        メモオブジェクトを文字列で表現する。

        Returns:
            str: メモオブジェクトの文字列表現 (例: <Memo 1>)
        """
        return f'<Memo {self.id}>'

db.Column を使って、データベースのカラム (列) を定義します。

  • データ型: db.Integer, db.String, db.DateTime など
  • 制約:
    • primary_key=True: 主キー
    • nullable=False: NULLを許可しない
    • server_default=db.func.now(): デフォルト値は現在時刻
    • onupdate=db.func.now(): 更新時に現在時刻を自動更新

__repr__ メソッドは、デバッグ時にオブジェクトの内容を確認するのに役立ちます。

コンストラクタについて:
Flask-SQLAlchemyのモデルクラスでは、db.Column で定義した属性が暗黙的にコンストラクタの引数として扱われます。
つまり、Memo(content="メモの内容") のように、属性をキーワード引数として渡してオブジェクトを作成できます。
これは、他人のコードを読む際にも重要なポイントです。

データベース操作

モデルを定義したら、データベースを操作してみましょう。

まずは、テーブルを作成します。


# app.py などで
db.create_all()

次に、データを取得します。以下のコードは全てのメモを取得します。


memos = Memo.query.all()

新しいメモを作成するには、次のようにします。


@app.route('/create', methods=['POST'])
def create():
    """
    新しいメモを作成する。

    Returns:
        str: メモ一覧ページへのリダイレクト
    """
    content = request.form['content']
    new_memo = Memo(content=content)  # ここでコンストラクタが呼ばれる
    db.session.add(new_memo)
    db.session.commit()
    return redirect(url_for('index'))
  • Memo() で新しい Memo オブジェクトを作成します。
  • db.session.add() で、データベースに追加する準備をします。
  • db.session.commit() で、変更をデータベースに反映します。

db.session は、データベースとのやり取りを一時的に管理するオブジェクトです。

まとめ

Flask-SQLAlchemyを使うことで、Flaskアプリケーションとデータベースの連携が容易になります。
モデル定義とデータベース操作の基本を理解することで、Flaskアプリケーション開発の幅が広がります。

今後の学習

  • より複雑なモデル (リレーションシップを持つモデルなど) の定義方法。
  • Flask-Migrate (データベースマイグレーションツール) の使い方。
  • SQLAlchemyのより高度な機能 (クエリの応用、トランザクション管理など)。

Comments

No comments yet. Why don’t you start the discussion?

    コメントを残す

    メールアドレスが公開されることはありません。 が付いている欄は必須項目です