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?
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.