1. ホーム
  2. python

[解決済み] declarative_base()とdb.Modelの違いは何ですか?

2023-01-27 15:14:12

質問

その クイックスタート・チュートリアル を継承したテーブルモデルを作るように指示します。 db.Model クラスを継承したテーブルモデルを作るように指示します。

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

ただし SQLAlchemyチュートリアル とボトル-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 ベースのモデルがクエリオブジェクトにアクセスする際に Model.query としてアクセスできるようになります。 session.query(Model) .

_QueryProperty クエリクラスも、SQLAlchemy のクエリをサブクラス化したものです。Flask-SQLAlchemy のサブクラスは、SQLAlchemy には存在しない、3つのクエリメソッドを追加しています。 get_or_404() , first_or_404()paginate() .

違いはこれだけだと思います。