Яка різниця між декларативною_базою () та db.Model?


83

Підручник з швидкого запуску для плагіна 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'
    ...

У чому різниця між цими двома підходами?

Відповіді:


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Властивість дозволяє моделі на основі Колба-SQLAlchemy для доступу до об'єкта запиту , як Model.queryзамість SQLAlchemy - х session.query(Model).

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

Я вважаю, що це єдині відмінності.


1
Я просто шукав це сьогодні для цього додатка, який я будував рік або близько того, спочатку заснований на вашому "Підручнику з мега колби", який використовує db.Model, а не явно використовуючи Base = Declarative_Base. Я заплутався, бо всі мої моделі явно використовують розширення Declarative, але я ніколи не називав декларативний_базу (). Дякую за чудове пояснення!
Chockomonkey

Чи можна використовувати db.Model в одній Моделі користувача та Base в Адресній Моделі. Наприклад: - клас User (db.Model), клас Address (Base)?
Сайф Алі Каредія,

Не впевнений, але я здогадуюсь, що деякі речі не спрацюють. Flask-SQLAlchemy додає деяку поведінку до бази в db.Modelкласі, тому будь-які моделі, які успадковуються безпосередньо від декларативної бази, цього не матимуть.
Мігель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.