web-dev-qa-db-ja.com

declarative_base()とdb.Modelの違いは何ですか?

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つのアプローチの違いは何ですか?

76
drs

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()

これらが唯一の違いだと思います。

60
Miguel