Подтвердить что ты не робот

В чем разница между declarative_base() и db.Model?

руководство по быстрому запуску для плагина Flask-SQLAlchemy указывает пользователям создавать модели таблиц, наследующие класс 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'
    ...

В чем разница между этими двумя подходами?

4b9b3361

Ответ 1

В исходном коде 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, он просто добавляет поддержку для вычисления значения по умолчанию для __table__ (имя таблицы), а также для обработки привязок.

Свойство base.query позволяет моделям на основе Flask-SQLAlchemy обращаться к объекту запроса как Model.query вместо SQLAlchemy session.query(Model).

Класс запросов _QueryProperty также подклассифицирован из запроса SQLAlchemy. Подкласс Flask-SQLAlchemy добавляет три дополнительных метода запросов, которые не существуют в SQLAlchemy: get_or_404(), first_or_404() и paginate().

Я считаю, что это единственные различия.