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


83

Flask-SQLAlchemyプラグインのクイックスタートチュートリアルでは、db.Modelクラスを継承するテーブルモデルを作成するようにユーザーに指示しています。

app = Flask(__main__)
db = SQLAlchemy(app)
class Users(db.Model):
    __tablename__ = 'users'
    ...

ただし、SQLAlchemyチュートリアルとbottle-SQLAlchemy READMEはどちらも、テーブルモデルがBaseからインスタンス化されたものを継承することを示唆していますdeclarative_base()

Base = declarative_base()
class Users(Base):
    __tablename__ = 'users'
    ...

これら2つのアプローチの違いは何ですか?

回答:


81

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ベースのモデルModel.queryがSQLAlchemyの代わりにクエリオブジェクトにアクセスできるようになりますsession.query(Model)

_QueryPropertyクエリクラスはまた、SQLAlchemyののクエリからサブクラス化されます。Flask-SQLAlchemyサブクラスは、SQLAlchemyには存在しない3つのクエリメソッドを追加します:get_or_404()first_or_404()およびpaginate()

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


1
私は今日、1年ほど構築してきたこのアプリを探していました。元々は、Base = Declarative_Baseを明示的に使用するのではなく、db.Modelを使用する「MegaFlaskTutorial」に基づいています。私のモデルはすべて明らかに宣言型拡張機能を使用しているので混乱しましたが、それでもdeclarative_base()を呼び出したことがありませんでした。素晴らしい説明をありがとう!
Chockomonkey 2016年

1つのユーザーモデルでdb.Modelを使用し、アドレスモデルでBaseを使用することは可能ですか。例:-クラスUser(db.Model)、クラスAddress(Base)?
Saif ali Karedia 2017

確かではありませんが、いくつかのことがうまくいかないのではないかと思います。Flask-SQLAlchemyはdb.Modelクラスのベースにいくつかの動作を追加するため、宣言型ベースから直接継承するモデルにはそれがありません。
ミゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.