Kolben-Sqlalchemie oder Sqlalchemie


91

Ich bin sowohl in der Kolben- als auch in der Sqlalchemie neu. Ich arbeite gerade an einer Kolben-App und verwende Sqlalchemie vorerst. Ich habe mich gefragt, ob es einen signifikanten Vorteil gibt, den ich durch die Verwendung von Flask-Sqlalchemy gegenüber Sqlalchemy erzielen kann. Ich konnte nicht genug Motivationen in http://packages.python.org/Flask-SQLAlchemy/index.html finden oder vielleicht habe ich den Wert nicht verstanden !! Ich würde mich über Ihre Klarstellungen freuen.


6
Hmm, hier gibt es noch keine zufriedenstellende Antwort. Kann jemand erklären, was die tatsächlichen konkreten Vorteile von in einer Flask-App flask-sqlalchemyüber alt sind sqlalchemy?
Steve Bennett

Ein großer Nachteil ist Flask-SqlAlchemyjedoch, dass es keine Möglichkeit gibt, Mandantenfähigkeit in der App einzurichten. Das ist IMO größtes Negativ. bindsEs wird lediglich bereitgestellt, unterschiedliche Datenbanken an unterschiedliche Modelle anzuhängen, während es keine Möglichkeit gibt, mandantenspezifische Datenbanken mit demselben Modell zu verwenden.
Rohit Jain

Antworten:


66

Das Hauptmerkmal der Flask-SQLAlchemyist die ordnungsgemäße Integration in die Flask-Anwendung - sie erstellt und konfiguriert Engine, Verbindung und Sitzung und konfiguriert sie für die Verwendung mit der Flask-App.

Dieses Setup ist recht komplex, da wir die Sitzung mit Gültigkeitsbereich erstellen und sie entsprechend dem Lebenszyklus der Flask-Anwendungsanforderung / -antwort ordnungsgemäß verarbeiten müssen.

In der idealen Welt wäre das das einzige Merkmal von Flask-SQLAlchemy, aber tatsächlich fügt es ein paar weitere Dinge hinzu. Hier ist ein guter Blog-Beitrag mit einer Übersicht: Demystifying Flask-SQLAlchemy .

Als ich zum ersten Mal mit Flask und SQLAlchemy gearbeitet habe, hat mir dieser Aufwand nicht gefallen. Ich ging hinüber und extrahierte den Sitzungsverwaltungscode aus der Erweiterung. Dieser Ansatz funktioniert, obwohl ich festgestellt habe, dass es ziemlich schwierig ist, diese Integration richtig durchzuführen.

Der einfachere Ansatz (der in einem anderen Projekt verwendet wird, an dem ich arbeite) besteht darin, einfach einzusteigen Flask-SQLAlchemyund keine der zusätzlichen Funktionen zu verwenden, die er bietet. Sie haben das db.sessionund können es verwenden, als wäre es ein reines SQLAlchemySetup.


4
Ich bleibe verwirrt. Der verlinkte Blog-Beitrag (und die offiziellen Dokumente!) Listet einige einfache SQLAlchemy-Funktionen (wie die deklarative Basis) auf, als wären sie Flask-SQLAlchemy-Funktionen. Es ist unklar, ob sie für Dinge, die in SQLAlchemy eingebaut sind, Anerkennung finden oder sie neu implementiert haben (noch warum sie dies getan haben, wenn es das letztere ist). In Ihrem ersten Absatz werden zwei Funktionen aufgeführt: Convenience-Wrapper für die Sitzungsverwaltung (müssen Sie aber trotzdem keine eigenen rollen, wenn Sie Ihre SQLAlchemy-Modelle außerhalb von Flask verwenden möchten ?) Und einige nicht spezifizierte "Konfigurationen", um "mit der Flask-App zu arbeiten". . Was bedeutet , dass Mittel ?
Mark Amery

1
Ich bin auch ein bisschen verwirrt von Fragen. Der verknüpfte Blog-Beitrag ist IMO ziemlich klar. Er sagt beispielsweise "Benutzerdefiniertes deklaratives Basismodell mit Unterstützung für Abfrageeigenschaften und Paginierung", der Schlüssel ist "benutzerdefiniert" und "mit Unterstützung für Abfrageeigenschaften und Paginierung" wird hinzugefügt Deklarative Basis von SQLAlchemy.
Boris Serebrov

1
In Bezug auf die "Convenience Wrapper" - sie dienen nicht der Bequemlichkeit, sondern dienen dazu, dass die Dinge richtig funktionieren. Um SQLAlchemy verwenden zu können, benötigen Sie die Datenbankverbindungsobjekte (eninge / connection / session) und möchten diese nicht jedes Mal erstellen, wenn Sie eine SQL-Abfrage durchführen müssen. Daher sollten diese global erstellt werden und im gesamten Anwendungscode verfügbar sein. Sie können also so etwas wie "aus Ihrer Anwendung importieren db" und dann "db.session.something ()" ausführen, ohne darüber nachzudenken, wie dieses "db" -Objekt ordnungsgemäß erstellt und initialisiert werden soll.
Boris Serebrov

Und was die nicht spezifizierte "Konfiguration" für "Arbeiten mit der Flask-App" betrifft - sie wird tatsächlich im zweiten Absatz angegeben: This setup is quite complex as we need to create the scoped session and properly handle it according to the Flask application request/response life-cycle.Weitere Details finden Sie in den SQLAlchemy-Dokumenten: Wann erstelle ich eine Sitzung, wann schreibe ich sie fest und wann mache ich sie Schließe es? und kontextbezogene / threadlokale Sitzungen .
Boris Serebrov

20

Um ehrlich zu sein, sehe ich keine Vorteile. IMHO, Flask-SQLAlchemy erstellt eine zusätzliche Ebene, die Sie nicht wirklich benötigen. In unserem Fall haben wir eine ziemlich komplexe Flask-Anwendung mit mehreren Datenbanken / Verbindungen (Master-Slave), die sowohl ORM als auch Core verwenden, wobei wir unter anderem unsere Sitzungen / DB-Transaktionen steuern müssen (z. B. Dryrun- oder Commit-Modi). Flask-SQLAlchemy fügt einige zusätzliche Funktionen hinzu, z. B. die automatische Zerstörung der Sitzung, wobei einige Dinge für Sie vorausgesetzt werden, die sehr oft nicht Ihren Anforderungen entsprechen.


5
Ja, in Ihrem Anwendungsfall scheint Flask-SQLAlchemy veraltet zu sein. Aber wenn das OP ein solches Szenario hätte, würde er diese Frage wahrscheinlich nicht stellen. Für einen neuen Benutzer, der nichts über den Sitzungsumfang weiß, ist Flask-SQLAlchemy definitiv ein Muss!
Schlamar

20

Flask-SQLAlchemy bietet Ihnen eine Reihe nützlicher Extras, die Sie sonst mit SQLAlchemy selbst implementieren würden.

Positive Seiten bei der Verwendung von Flask-SQLAlchemy


  1. Flask_SQLAlchemy übernimmt die Sitzungskonfiguration, Einrichtung und den Abbau für Sie.
  2. Bietet Ihnen ein deklaratives Basismodell, das das Abfragen und Paginieren erleichtert
  3. Backend-spezifische Einstellungen.Flask-SQLAlchemy überprüft installierte Bibliotheken auf Unicode-Unterstützung und verwendet bei Fehlern automatisch SQLAlchemy Unicode.
  4. Hat eine Methode namens apply_driver_hacks, die automatisch vernünftige Standardeinstellungen auf Thigs wie MySQL-Poolgröße setzt
  5. Hat nette eingebaute Methoden create_all () und drop_all () zum Erstellen und Löschen aller Tabellen. Nützlich zum Testen und in der Python-Befehlszeile, wenn Sie etwas Dummes getan haben
  6. Sie erhalten get_or_404 () anstelle von get () und find_or_404 () anstelle von find (). Codebeispiel unter> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Tabellennamen automatisch festlegen. Flask-SQLAlchemy legt Ihre Tabellennamen automatisch fest und konvertiert Ihre ClassName> class_namedies kann durch Festlegen des __tablename__Klassenlistenelements überschrieben werden

Negative Seiten bei Verwendung von Flask-SQLAlchemy


  1. Die Verwendung von Flask-SQLAlchemy erschwert die Migration von Flask zu Pyramid, wenn Sie dies jemals benötigen. Dies ist hauptsächlich auf das benutzerdefinierte deklarative Basismodell für Flask_SQLAchemy zurückzuführen.
  2. Mit Flask-SQLAlchemy riskieren Sie die Verwendung eines Pakets mit einer viel kleineren Community als SQLAlchemy selbst, das ich nicht so schnell aus der aktiven Entwicklung streichen kann.
  3. Einige nette Extras, die Flask-SQLAlchemy hat, können Sie verwirren, wenn Sie nicht wissen, dass sie da sind.

16

In der SQLAlchemy-Dokumentation heißt es eindeutig, dass Sie Flask-SQLAlchemy verwenden sollten (insbesondere, wenn Sie die Vorteile nicht verstehen!):

[...] Produkte wie Flask-SQLAlchemy [...] SQLAlchemy empfiehlt dringend, diese Produkte nach Verfügbarkeit zu verwenden.

Dieses Zitat und eine ausführliche Motivation finden Sie in der zweiten Frage der Sitzungs-FAQ .


2
Die Kolben-Sqlalchemie scheint nicht aufrechterhalten zu werden. Das letzte Update war am 1. August 2013. Ist dieser Rat nicht mehr relevant?
pmav99

@ pmav99 Solange Sie keine konkreten Probleme damit haben, würde ich es trotzdem empfehlen, insbesondere für neue Benutzer.
Schlamar

1
Scheint ab November 2014 aktiv gepflegt zu werden. Viele der jüngsten Commits. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett

25
Obwohl OP es nicht direkt gefragt hat, imo. er wollte die Vorteile von Flask-SQLAlchemy kennenlernen. Ihre Antwort lautet wörtlich "Verwenden Sie es, auch wenn Sie nicht wissen, was die Vorteile sind" - ja, was sind die Vorteile?
Markus Meskanen

1
Diese Antwort beantwortet nicht die Frage des OP. Sie empfehlen flask-sqlalchemy, ohne viel Grund für die Empfehlung zu liefern.
mbadawi23

7

Wie @schlamar vorschlägt, ist Flask-SqlAlchemy auf jeden Fall eine gute Sache. Ich möchte dem dort gemachten Punkt nur einen zusätzlichen Kontext hinzufügen.

Haben Sie nicht das Gefühl, dass Sie eine über die andere wählen. Nehmen wir zum Beispiel an, wir möchten alle Datensätze mithilfe eines Modells mit Flask-Sqlalchemy aus einer Tabelle abrufen. Es ist so einfach wie

Model.query.all()

Für viele der einfachen Fälle wird Flask-Sqlalchemy völlig in Ordnung sein. Der zusätzliche Punkt, den ich ansprechen möchte, ist, wenn Flask-Sqlalchemy nicht tun wird, was Sie wollen, dann gibt es keinen Grund, warum Sie SqlAlchemy nicht direkt verwenden können.

from myapp.database import db

num_foo = db.session.query(func.count(OtherModel.id)).filter(is_deleted=False).as_scalar()

db.session.query(Model.id, num_foo.label('num_foo')).order_by('num_foo').all()

Wie Sie sehen, können wir problemlos von einem zum anderen springen, und im zweiten Beispiel verwenden wir tatsächlich die von Flask-Sqlalchemy definierten Modelle.


1
„Zum Beispiel kann sagen , dass wir alle Datensätze aus einer Tabelle greifen wollen ein Modell mit Flask-sqlalchemy mit es so einfach wie. Model.query.all()“ - das kann alles mit getan wird nur SQLAlchemy, mit Flask-SQLAlchemy bietet absolut nichts Neues.
Markus Meskanen

Du bist toll! Ich bin auf diesen Beitrag gestoßen und er hat ein Problem gelöst, das ich hatte. Nachdem ich anaconda installiert hatte, funktionierten aus irgendeinem Grund normale Updates nicht. Aus irgendeinem Grund wurde von geändert Model.query.all(), db.session.query(Model).all()um die Sitzungen wie gewohnt zu verfolgen und zu aktualisieren.
Jeff Bluemel

2

Hier ist ein Beispiel für einen Vorteil, den Ihnen die Kolben-Sqlalchemie gegenüber der einfachen Sqlalchemie bietet.

Angenommen, Sie verwenden flask_user.

flask_user automatisiert die Erstellung und Authentifizierung von Benutzerobjekten, sodass auf Ihre Datenbank zugegriffen werden muss. Die Klasse UserManager ruft dazu einen sogenannten "Adapter" auf, der die Datenbankaufrufe abstrahiert. Sie stellen im UserManager-Konstruktor einen Adapter bereit, und der Adapter muss folgende Funktionen implementieren:

class MyAdapter(DBAdapter):
    def get_object(self, ObjectClass, id):
        """ Retrieve one object specified by the primary key 'pk' """
        pass

    def find_all_objects(self, ObjectClass, **kwargs):
         """ Retrieve all objects matching the case sensitive filters in 'kwargs'. """
        pass


    def find_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case sensitive filters in 'kwargs'. """
        pass

    def ifind_first_object(self, ObjectClass, **kwargs):
        """ Retrieve the first object matching the case insensitive filters in 'kwargs'. """
        pass

    def add_object(self, ObjectClass, **kwargs):
        """ Add an object of class 'ObjectClass' with fields and values specified in '**kwargs'. """
        pass

    def update_object(self, object, **kwargs):
        """ Update object 'object' with the fields and values specified in '**kwargs'. """
        pass

    def delete_object(self, object):
        """ Delete object 'object'. """
        pass

    def commit(self):
        pass

Wenn Sie flask-sqlalchemy verwenden, können Sie den integrierten SQLAlchemyAdapter verwenden. Wenn Sie sqlalchemy (not-flask-sqlalchemy) verwenden, können Sie unterschiedliche Annahmen darüber treffen, wie Objekte in der Datenbank gespeichert werden (wie die Namen der Tabellen), sodass Sie Ihre eigene Adapterklasse schreiben müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.