2014-03-27 13 views
35

Die quickstart tutorial für das Flask-SQLAlchemy-Plugin weist Benutzer an, Tabellenmodelle zu erstellen, die die Klasse db.Model erben, z.Was ist der Unterschied zwischen der declarative_base() und db.Model?

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

jedoch die SQLAlchemy tutorial und die Flasche-SQLAlchemy README vorschlagen, dass sowohl Tischmodelle ein Base von declarative_base() instanziiert erben.

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

Was ist der Unterschied zwischen diesen beiden Ansätzen?

Antwort

31

Blick in den Kolben-SQLAlchemy Quellcode der db.Model Klasse 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 _BoundDeclarativeMeta Metaklasse ist eine Unterklasse von SQLAlchemy der DeclarativeMeta Es fügt nur Unterstützung für die Berechnung eines Standardwerts für __table__ (der Tabellenname) und auch für die Behandlung von Bindungen hinzu.

Die Eigenschaft base.query ermöglicht Flask-SQLAlchemy-basierten Modellen den Zugriff auf ein Abfrageobjekt als Model.query anstelle von SQLAlchemy session.query(Model).

Die Abfrageklasse _QueryProperty wird ebenfalls von der SQLAlchemy-Abfrage abgeleitet. Die Flask-SQLAlchemy-Unterklasse fügt drei zusätzliche Abfragemethoden hinzu, die in SQLAlchemy nicht vorhanden sind: get_or_404(), first_or_404() und paginate().

Ich glaube, das sind die einzigen Unterschiede.

+0

Ich habe gerade nach dieser App gesucht, die ich seit ungefähr einem Jahr erstellt habe, ursprünglich basierend auf Ihrem "Mega Flask Tutorial", das db.Model anstelle von Base = Declarative_Base verwendet. Ich war verwirrt, weil meine Modelle alle eindeutig die deklarative Erweiterung verwenden, aber ich hatte noch nie declarative_base() aufgerufen. Danke für die tolle Erklärung! – Chockomonkey

+0

Ist es möglich, db.Model in einem Benutzermodell und Basis im Adressmodell zu verwenden. Zum Beispiel: - Klasse Benutzer (db.Model), Klasse Adresse (Base)? –

+0

Nicht sicher, aber ich vermute, dass einige Dinge nicht funktionieren werden. Flask-SQLAlchemy fügt der Basis in der Klasse 'db.Model' etwas Verhalten hinzu, so dass alle Modelle, die direkt von der deklarativen Basis erben, dies nicht haben. – Miguel

Verwandte Themen