Flask-SQLAlchemyプラグインの クイックスタートチュートリアル は、ユーザーに_db.Model
_クラスを継承するテーブルモデルを作成するように指示します。
_app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
__tablename__ = 'users'
...
_
ただし、 SQLAlchemy tutorial とbottle-SQLAlchemy [〜#〜] readme [〜#〜] はどちらも、テーブルモデルがからインスタンス化されたBase
を継承することを示唆していますdeclarative_base()
。
_Base = declarative_base()
class Users(Base):
__tablename__ = 'users'
...
_
これら2つのアプローチの違いは何ですか?
Flask-SQLAlchemyソースコードを見ると、_db.Model
_クラスは次のように初期化されています。
_self.Model = self.make_declarative_base()
_
そして、ここにmake_declarative_base()
メソッドがあります:
_def make_declarative_base(self):
"""Creates the declarative base."""
base = declarative_base(cls=Model, name='Model',
metaclass=_BoundDeclarativeMeta)
base.query = _QueryProperty(self)
return base
_
__BoundDeclarativeMeta
_メタクラスはSQLAlchemyのDeclarativeMeta
のサブクラスであり、___tablename__
_(テーブル名)のデフォルト値の計算とバインドの処理のサポートを追加するだけです。
_base.query
_プロパティにより、Flask-SQLAlchemyベースのモデルは、SQLAlchemyのsession.query(Model)
ではなく_Model.query
_としてクエリオブジェクトにアクセスできます。
__QueryProperty
_クエリクラスもSQLAlchemyのクエリからサブクラス化されます。 Flask-SQLAlchemyサブクラスは、SQLAlchemyに存在しない3つのクエリメソッドを追加します:get_or_404()
、first_or_404()
およびpaginate()
。
これらが唯一の違いだと思います。