web-dev-qa-db-fra.com

Quelle est la différence entre déclarative_base () et db.Model?

Le tutoriel de démarrage rapide pour le plugin Flask-SQLAlchemy indique aux utilisateurs de créer des modèles de table héritant de la classe db.Model, Par ex.

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

Cependant, le didacticiel SQLAlchemy et le flacon-SQLAlchemy README suggèrent tous deux que les modèles de table héritent d'un Base instancié de declarative_base().

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

Quelle est la différence entre ces deux approches?

76
drs

En regardant dans le code source Flask-SQLAlchemy, la classe db.Model Est initialisée comme suit:

self.Model = self.make_declarative_base()

Et voici la méthode 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

La métaclasse _BoundDeclarativeMeta Est une sous-classe de DeclarativeMeta de SQLAlchemy, elle ajoute simplement la prise en charge du calcul d'une valeur par défaut pour __tablename__ (Le nom de la table) et également pour gérer les liaisons.

La propriété base.query Permet aux modèles basés sur Flask-SQLAlchemy d'accéder à un objet de requête en tant que Model.query Au lieu de session.query(Model) de SQLAlchemy.

La classe de requête _QueryProperty Est également sous-classée à partir de la requête SQLAlchemy. La sous-classe Flask-SQLAlchemy ajoute trois méthodes de requête supplémentaires qui n'existent pas dans SQLAlchemy: get_or_404(), first_or_404() et paginate().

Je pense que ce sont les seules différences.

60
Miguel