Was ist der Unterschied zwischen deklarative_base () und db.Model?

83

Das Schnellstart-Tutorial für das Flask-SQLAlchemy-Plugin weist Benutzer an, Tabellenmodelle zu erstellen, die die db.ModelKlasse erben , z

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

Das SQLAlchemy-Tutorial und die Flaschen-SQLAlchemy- README schlagen jedoch beide vor, dass Tabellenmodelle eine Baseinstanziierte von erben declarative_base().

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

Was ist der Unterschied zwischen diesen beiden Ansätzen?

drs
quelle

Antworten:

80

Im Flask-SQLAlchemy-Quellcode wird die db.ModelKlasse wie folgt initialisiert:

self.Model = self.make_declarative_base()

Und hier ist die make_declarative_base()Methode:

def make_declarative_base(self):
    """Creates the declarative base."""
    base = declarative_base(cls=Model, name='Model',
                            metaclass=_BoundDeclarativeMeta)
    base.query = _QueryProperty(self)
    return base

Die _BoundDeclarativeMetaMetaklasse ist eine Unterklasse von SQLAlchemy. Sie DeclarativeMetabietet lediglich Unterstützung für die Berechnung eines Standardwerts für __tablename__(den Tabellennamen) und für die Verarbeitung von Bindungen.

Mit dieser base.queryEigenschaft können Flask-SQLAlchemy-basierte Modelle Model.queryanstelle von SQLAlchemy's auf ein Abfrageobjekt zugreifen session.query(Model).

Die _QueryPropertyAbfrageklasse wird auch von der Abfrage von SQLAlchemy untergeordnet. Die Kolben-SQLAlchemy Unterklasse fügt drei weitere Abfragemethoden , die in SQLAlchemy existieren nicht: get_or_404(), first_or_404()und paginate().

Ich glaube, das sind die einzigen Unterschiede.

Miguel
quelle
1
Ich habe heute nur nach dieser App gesucht, die ich seit ungefähr einem Jahr erstelle und die ursprünglich auf Ihrem "Mega Flask Tutorial" basiert, das db.Model verwendet, anstatt Base = Declarative_Base explizit zu verwenden. Ich war verwirrt, weil meine Modelle alle eindeutig die Erweiterung Declarative verwenden, aber ich hatte nie nie declative_base () aufgerufen. Danke für die tolle Erklärung!
Chockomonkey
Ist es möglich, db.Model in einem Benutzermodell und Base in Address Model zu verwenden? Zum Beispiel: - Klasse Benutzer (db.Model), Klasse Adresse (Basis)?
Saif ali Karedia
Ich bin mir nicht sicher, aber ich vermute, dass einige Dinge nicht funktionieren werden. Flask-SQLAlchemy fügt der Basis in der db.ModelKlasse ein gewisses Verhalten hinzu , sodass Modelle, die direkt von der deklarativen Basis erben, dies nicht haben.
Miguel