【Flask-SQLAlchemy】サンプルコードで基底モデルクラスの使い方を理解しよう

2024-05-01

Flask-SQLAlchemy で基底モデルクラスを宣言する方法

Flask-SQLAlchemy でアプリケーション全体で共通する属性やメソッドを定義する基底モデルクラスを作成できます。これは、アプリケーションのコードをより簡潔で保守しやすくするために役立ちます。

手順

  1. flask_sqlalchemy.Base クラスを継承する基底モデルクラスを作成します。
  2. モデルクラスの属性を定義します。

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base

db = SQLAlchemy()

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(255), unique=True, nullable=False)
    email = db.Column(db.String(255), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)

    def __repr__(self):
        return f'<User id={self.id} username={self.username} email={self.email}>'

説明

  • Base クラスは、Flask-SQLAlchemy で使用するすべてのモデルクラスの基底クラスです。
  • User クラスは Base クラスを継承するモデルクラスです。
  • __tablename__ 属性は、データベース内のテーブルの名前を指定します。
  • id 属性は、主キーとなる整数型の列です。
  • username 属性は、ユニークな文字列型の列です。
  • password 属性は、文字列型の列です。
  • __repr__() メソッドは、オブジェクトの文字列表現を返します。

利点

  • アプリケーション全体で共通する属性やメソッドを定義することで、コードをより簡潔にできます。
  • モデルクラスの継承を使用することで、コードの再利用性を高めることができます。
  • 基底モデルクラスに共通のロジックを実装することで、コードをより保守しやすくできます。



以下は、Flask-SQLAlchemy で基底モデルクラスを作成し、それを継承してユーザーモデルを作成するサンプルコードです。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
db = SQLAlchemy(app)

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(255), unique=True, nullable=False)
    email = db.Column(db.String(255), unique=True, nullable=False)
    password = db.Column(db.String(255), nullable=False)

    def __repr__(self):
        return f'<User id={self.id} username={self.username} email={self.email}>'

# データベースを作成する
db.create_all()

# ユーザーを追加する
user = User(username='johndoe', email='[email protected]', password='password')
db.session.add(user)
db.session.commit()

# ユーザーを取得する
user = User.query.get(1)
print(user)
  • app 変数は Flask アプリケーションを作成します。
  • app.config['SQLALCHEMY_DATABASE_URI'] 設定には、データベースの URI を指定します。
  • db 変数は Flask-SQLAlchemy インスタンスを作成します。
  • Base 変数は declarative_base() 関数を使用して基底モデルクラスを作成します。
  • db.create_all() メソッドは、データベースに定義されたすべてのテーブルを作成します。
  • user = User(username='johndoe', email='[email protected]', password='password') 行は、新しいユーザーオブジェクトを作成します。
  • db.session.add(user) 行は、ユーザーオブジェクトをセッションに追加します。
  • db.session.commit() 行は、セッション内の変更をコミットします。
  • user = User.query.get(1) 行は、ID が 1 のユーザーを取得します。
  • print(user) 行は、ユーザーオブジェクトを出力します。

実行方法

  1. コードを保存します。
  2. ターミナルで以下のコマンドを実行します。
flask run
  1. ブラウザで http://localhost:5000/ にアクセスします。

出力

<User id=1 username=johndoe [email protected]>

補足

  • このコードは、Flask-SQLAlchemy の基本的な使用方法を示すものです。
  • 実際のアプリケーションでは、より多くのモデルクラスや属性、メソッドを追加する必要があります。
  • セキュリティ対策として、パスワードをハッシュ化して保存する必要があります。



Flask-SQLAlchemy で基底モデルクラスを宣言するその他の方法

ミックスインを使用する

Flask-SQLAlchemy には、モデルクラスに共通の属性やメソッドを追加するために使用できるミックスインが用意されています。

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base, declared_attribute

Base = declarative_base()

class TimestampedMixin:
    created_at = declared_attribute(db.Column(db.DateTime, default=db.func.now()))
    updated_at = declared_attribute(db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now()))

    @created_at.setter
    def created_at(self, value):
        self._created_at = value

    @updated_at.setter
    def updated_at(self, value):
        self._updated_at = value

class User(Base, TimestampedMixin):
    __tablename__ = 'users'
    # ... (その他の属性)
  • TimestampedMixin クラスは、created_atupdated_at という属性を追加するミックスインです。
  • declared_attribute デコレータは、カスタム属性を作成するために使用されます。
  • default=db.func.now() 引数は、属性のデフォルト値を現在の時刻に設定します。
  • onupdate=db.func.now() 引数は、属性が更新されるたびに現在の時刻に更新されるように設定します。
  • ミックスインを使用すると、コードをより簡潔にすることができます。

カスタムデコレータを使用する

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

def add_timestamps(cls):
    cls.created_at = db.Column(db.DateTime, default=db.func.now())
    cls.updated_at = db.Column(db.DateTime, default=db.func.now(), onupdate=db.func.now())
    return cls

@add_timestamps
class User(Base):
    __tablename__ = 'users'
    # ... (その他の属性)
  • @add_timestamps デコレータは User クラスに適用されます。

Flask-SQLAlchemy で基底モデルクラスを宣言するには、さまざまな方法があります。どの方法を使用するかは、アプリケーションのニーズによって異なります。


flask sqlalchemy flask-sqlalchemy


【SQLAlchemy】Check join condition of a relationship の使い方とサンプルコード

具体的な使い方以下のコード例は、User と Address テーブル間のリレーションシップにおける結合条件を検証する方法を示しています。このコード例で説明されているように、以下のことが可能です。リレーションシップが存在するか検証する特定の条件で結合されているか検証する...