【Flask-SQLAlchemy】サンプルコードで基底モデルクラスの使い方を理解しよう
2024-05-01
Flask-SQLAlchemy で基底モデルクラスを宣言する方法
Flask-SQLAlchemy でアプリケーション全体で共通する属性やメソッドを定義する基底モデルクラスを作成できます。これは、アプリケーションのコードをより簡潔で保守しやすくするために役立ちます。
手順
flask_sqlalchemy.Base
クラスを継承する基底モデルクラスを作成します。- モデルクラスの属性を定義します。
例
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)
行は、ユーザーオブジェクトを出力します。
実行方法
- コードを保存します。
- ターミナルで以下のコマンドを実行します。
flask run
- ブラウザで
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_at
とupdated_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