flask-sqlalchemy o sqlalchemy


93

Sono nuovo sia in flask che in sqlalchemy, ho appena iniziato a lavorare su un'app flask e per ora sto usando sqlalchemy. Mi chiedevo se c'è qualche vantaggio significativo che posso ottenere dall'uso di flask-sqlalchemy rispetto a sqlalchemy. Non sono riuscito a trovare abbastanza motivazioni in http://packages.python.org/Flask-SQLAlchemy/index.html o forse non ne ho capito il valore !! Apprezzerei i tuoi chiarimenti.


6
Hmm, non c'è ancora una risposta soddisfacente qui. Qualcuno può spiegare quali sono i vantaggi concreti reali di flask-sqlalchemysono oltre pianura vecchio sqlalchemyin un'applicazione Flask?
Steve Bennett

Un grande svantaggio, Flask-SqlAlchemytuttavia , è che non fornisce alcun modo per configurare il multi-tenancy nell'app. Questo è il più grande aspetto negativo IMO. bindsfornito solo per collegare un database diverso a un modello diverso, mentre non è possibile utilizzare un database specifico del tenant con lo stesso modello.
Rohit Jain

Risposte:


68

La caratteristica principale di Flask-SQLAlchemyè la corretta integrazione con l'applicazione Flask: crea e configura motore, connessione e sessione e la configura per funzionare con l'app Flask.

Questa configurazione è piuttosto complessa in quanto è necessario creare la sessione con ambito e gestirla correttamente in base al ciclo di vita di richiesta / risposta dell'applicazione Flask.

Nel mondo ideale sarebbe l'unica caratteristica di Flask-SQLAlchemy, ma in realtà aggiunge poche altre cose. Ecco un buon post sul blog con la loro panoramica: Demystifying Flask-SQLAlchemy .

Quando ho lavorato per la prima volta con Flask e SQLAlchemy, non mi piaceva questo sovraccarico. Sono andato oltre ed ho estratto il codice di gestione della sessione dall'estensione. Questo approccio funziona, anche se ho scoperto che è abbastanza difficile eseguire correttamente questa integrazione.

Quindi l'approccio più semplice (che viene utilizzato in un altro progetto su cui sto lavorando) è semplicemente inserire Flask-SQLAlchemye non utilizzare nessuna delle funzionalità aggiuntive che fornisce. Avrai db.sessione potrai usarlo come se fosse pura SQLAlchemyconfigurazione.


4
Rimango confuso. Il post del blog collegato (e la documentazione ufficiale!) Elenca alcune semplici funzionalità di SQLAlchemy (come la base dichiarativa) come se fossero funzionalità Flask-SQLAlchemy; non è chiaro se si stanno prendendo il merito di cose incorporate in SQLAlchemy o se l'hanno reimplementata (né perché lo hanno fatto, se è il secondo). Il tuo primo paragrafo elenca due caratteristiche: wrapper di convenienza per la gestione delle sessioni (ma non dovrai comunque eseguire il rollio del tuo se vuoi usare i tuoi modelli SQLAlchemy fuori Flask?) E qualche "configurazione" non specificata per "lavorare con l'app Flask" . Cosa significa ?
Mark Amery

1
Sono anche un po 'confuso dalle domande. Il post del blog collegato è abbastanza chiaro IMO, ad esempio, dice "Modello base dichiarativo personalizzato con supporto per proprietà di query e impaginazione" la chiave è "personalizzata" e "con supporto per proprietà di query e impaginazione" è ciò che aggiunge Base dichiarativa di SQLAlchemy.
Boris Serebrov

1
Per quanto riguarda gli "involucri convenienza", non sono per comodità, ma per far funzionare le cose correttamente. Per iniziare a utilizzare SQLAlchemy hai bisogno degli oggetti di connessione al database (eninge / connection / session) e non vuoi crearli ogni volta che devi fare una query SQL, quindi questi dovrebbero essere creati globalmente e disponibili attraverso il codice dell'applicazione. Quindi puoi fare qualcosa come "from yourapplication import db" e poi fare "db.session.something ()" senza pensare a come creare e inizializzare correttamente questo oggetto "db".
Boris Serebrov

E per quanto riguarda la "configurazione" non specificata per "lavorare con l'app Flask" - è effettivamente specificata nel secondo paragrafo: 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.Vedi maggiori dettagli nei documenti di SQLAlchemy: Quando costruisco una sessione, quando la metto in commit e quando lo faccio chiudilo? e sessioni contestuali / locali di thread .
Boris Serebrov

20

Ad essere onesti, non vedo alcun vantaggio. IMHO, Flask-SQLAlchemy crea un livello aggiuntivo di cui non hai davvero bisogno. Nel nostro caso abbiamo un'applicazione Flask abbastanza complessa con più database / connessioni (master-slave) che utilizzano sia ORM che Core dove, tra le altre cose, abbiamo bisogno di controllare le nostre sessioni / transazioni DB (es. Modalità dryrun vs commit). Flask-SQLAlchemy aggiunge alcune funzionalità aggiuntive come la distruzione automatica della sessione assumendo alcune cose per te che molto spesso non sono ciò di cui hai bisogno.


5
Sì, nel tuo caso d'uso Flask-SQLAlchemy sembra obsoleto. Ma se l'OP avesse uno scenario del genere, probabilmente non farà questa domanda. Per un nuovo utente che non sa nulla dell'ambito della sessione Flask-SQLAlchemy è sicuramente un must!
schlamar

20

Flask-SQLAlchemy ti offre una serie di simpatici extra che altrimenti finiresti per implementare te stesso usando SQLAlchemy.

Lati positivi nell'utilizzo di Flask-SQLAlchemy


  1. Flask_SQLAlchemy gestisce la configurazione, l'installazione e lo smontaggio della sessione per te.
  2. Fornisce un modello di base dichiarativo che semplifica le query e l'impaginazione
  3. Impostazioni specifiche del backend Flask-SQLAlchemy analizza le librerie installate per il supporto Unicode e se fallisce utilizza automaticamente SQLAlchemy Unicode.
  4. Ha un metodo chiamato apply_driver_hacksche imposta automaticamente sane impostazioni predefinite su cose come MySQL pool-size
  5. Ha dei bei metodi build_all () e drop_all () per creare e rilasciare tutte le tabelle. Utile per i test e nella riga di comando di Python se hai fatto qualcosa di stupido
  6. Ti dà get_or_404 () invece di get () e find_or_404 () invece di find () Esempio di codice su> http://flask-sqlalchemy.pocoo.org/2.1/queries/

Imposta automaticamente i nomi delle tabelle. Flask-SQLAlchemy imposta automaticamente i nomi delle tabelle convertendo il tuo ClassName> class_namequesto può essere sovrascritto impostando l' __tablename__elemento dell'elenco di classe

Lati negativi sull'utilizzo di Flask-SQLAlchemy


  1. L'uso di Flask-SQLAlchemy aggiungerà ulteriori difficoltà per la migrazione da Flask a diciamo Pyramid, se necessario. Ciò è dovuto principalmente al modello base dichiarativo personalizzato su Flask_SQLAchemy.
  2. Utilizzando Flask-SQLAlchemy rischi di utilizzare un pacchetto con una comunità molto più piccola della stessa SQLAlchemy, che non posso eliminare facilmente dallo sviluppo attivo in tempi brevi.
  3. Alcuni simpatici extra di Flask-SQLAlchemy possono farti confondere se non sai che ci sono.

15

La documentazione di SQLAlchemy afferma chiaramente che dovresti usare Flask-SQLAlchemy (soprattutto se non ne capisci i vantaggi!):

[...] prodotti come Flask-SQLAlchemy [...] SQLAlchemy consiglia vivamente di utilizzare questi prodotti come disponibili.

Questa citazione e una motivazione dettagliata puoi trovare nella seconda domanda delle Domande frequenti sulla sessione .


2
Flask-sqlalchemy sembra non essere mantenuto. L'ultimo aggiornamento è stato il 1 ° agosto 2013. Questo consiglio è più pertinente?
pmav99

@ pmav99 fintanto che non hai problemi concreti con esso lo consiglierei comunque, soprattutto per i nuovi utenti.
schlamar

1
Sembra essere mantenuto attivamente a partire da novembre 2014. Molti impegni recenti. github.com/mitsuhiko/flask-sqlalchemy/commits/master
Steve Bennett

25
Anche se OP non l'ha chiesto direttamente, imo. voleva conoscere i vantaggi di Flask-SQLAlchemy. La tua risposta è letteralmente "usalo anche se non sai quali sono i vantaggi" - sì, quali sono i vantaggi?
Markus Meskanen

1
Questa risposta non risponde alla domanda del PO. Stai raccomandando flask-sqlalchemy, senza fornire molte ragioni dietro la raccomandazione.
mbadawi23

7

come suggerisce @schlamar, Flask-SqlAlchemy è sicuramente una buona cosa. Vorrei solo aggiungere un po 'di contesto extra al punto qui esposto.

Non sentirti come se stessi scegliendo l'uno sull'altro. Ad esempio, supponiamo di voler acquisire tutti i record da una tabella utilizzando un modello utilizzando Flask-Sqlalchemy. Semplice come

Model.query.all()

Per molti casi semplici, Flask-Sqlalchemy andrà benissimo. Il punto in più che vorrei sottolineare è che se Flask-Sqlalchemy non farà quello che vuoi, non c'è motivo per cui non puoi usare SqlAlchemy direttamente.

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()

Come puoi vedere possiamo passare facilmente dall'uno all'altro senza problemi e nel secondo esempio stiamo infatti utilizzando i modelli definiti da Flask-Sqlalchemy.


1
"Ad esempio, diciamo di voler prendere tutti i record da una tabella utilizzando un modello utilizzando Flask-Sqlalchemy. È semplice come Model.query.all()" - tutto questo può essere fatto solo con SQLAlchemy, utilizzando Flask-SQLAlchemy non fornisce assolutamente nulla di nuovo qui.
Markus Meskanen

sei fantastico! Mi sono imbattuto in questo post e ha risolto un problema che stavo avendo. dopo aver installato anaconda, per qualche motivo i normali aggiornamenti non funzionavano. cambiato da Model.query.all()a db.session.query(Model).all()per qualche motivo ha consentito il monitoraggio delle sessioni e l'aggiornamento normalmente.
Jeff Bluemel

2

Ecco un esempio di un vantaggio che flask-sqlalchemy ti offre rispetto a sqlalchemy semplice.

Supponi di utilizzare flask_user.

flask_user automatizza la creazione e l'autenticazione degli oggetti utente, quindi deve accedere al database. La classe UserManager fa ciò chiamando a qualcosa chiamato "adattatore" che astrae le chiamate al database. Fornisci un adattatore nel costruttore di UserManager e l'adattatore deve implementare queste funzioni:

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

Se stai usando flask-sqlalchemy, puoi usare SQLAlchemyAdapter incorporato. Se stai usando sqlalchemy (not-flask-sqlalchemy) potresti fare ipotesi diverse sul modo in cui gli oggetti vengono salvati nel database (come i nomi delle tabelle), quindi dovrai scrivere la tua classe adattatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.