Come faccio a sapere se posso disabilitare SQLALCHEMY_TRACK_MODIFICATIONS?


136

Ogni volta che eseguo la mia app che utilizza Flask-SQLAlchemy ricevo il seguente avviso che il SQLALCHEMY_TRACK_MODIFICATIONS opzione verrà disabilitata.

/home/david/.virtualenvs/flask-sqlalchemy/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')

Ho provato a scoprire cosa fa questa opzione, ma la documentazione di Flask-SQLAlchemy non è chiara su ciò che utilizza questo monitoraggio.

SQLALCHEMY_TRACK_MODIFICATIONS

Se impostato su True (impostazione predefinita) Flask-SQLAlchemy terrà traccia delle modifiche degli oggetti ed emetterà segnali. Ciò richiede memoria aggiuntiva e può essere disabilitato se non necessario.

Come faccio a sapere se il mio progetto richiede SQLALCHEMY_TRACK_MODIFICATIONS = Trueo se posso disabilitare in modo sicuro questa funzione e risparmiare memoria sul mio server?

Risposte:


175

Molto probabilmente la tua applicazione non utilizza il sistema di eventi Flask-SQLAlchemy, quindi probabilmente sarai sicuro di spegnerlo. Dovrai controllare il codice per verificare: stai cercando tutto ciò che si aggancia models_committedobefore_models_committed . Se scopri che stai usando il sistema di eventi Flask-SQLAlchemy, probabilmente dovresti aggiornare il codice per usare invece il sistema di eventi integrato di SQLAlchemy.

Per disattivare il sistema di eventi Flask-SQLAlchemy (e disabilitare l'avviso), basta aggiungere:

SQLALCHEMY_TRACK_MODIFICATIONS = False

alla configurazione dell'app fino a quando non viene modificata l'impostazione predefinita (molto probabilmente in Flask-SQLAlchemy v3).


Contesto: ecco cosa ti dice l'avvertimento:

Flask-SQLAlchemy ha un proprio sistema di notifica degli eventi che viene sovrapposto a SQLAlchemy. Per fare ciò, tiene traccia delle modifiche alla sessione SQLAlchemy. Questo richiede risorse extra, quindi l'opzione SQLALCHEMY_TRACK_MODIFICATIONSti consente di disabilitare il sistema di tracciamento delle modifiche. Attualmente l'opzione predefinita è True, ma in futuro tale impostazione predefinita cambieràFalse , disabilitando così il sistema di eventi.

Per quanto ho capito, la logica del cambiamento è triplice:

  1. Non molte persone usano il sistema di eventi di Flask-SQLAlchemy, ma la maggior parte delle persone non si rende conto di poter risparmiare risorse di sistema disabilitandolo. Quindi un saner predefinito è disabilitarlo e chi lo desidera può accenderlo.

  2. Il sistema di eventi in Flask-SQLAlchemy è stato piuttosto difettoso (vedere i problemi collegati nella richiesta pull menzionata di seguito), richiedendo una manutenzione aggiuntiva per una funzionalità che poche persone usano.

  3. Nella v0.7, SQLAlchemy stesso ha aggiunto un potente sistema di eventi che include la possibilità di creare eventi personalizzati. Idealmente, il sistema di eventi Flask-SQLAlchemy non dovrebbe fare altro che creare alcuni hook e listener di eventi SQLAlchemy personalizzati e quindi consentire a SQLAlchemy stesso di gestire il trigger di eventi.

Puoi vedere di più nella discussione sulla richiesta pull che ha iniziato ad attivare questo avviso .


1
OK, ci stiamo avvicinando, ma manca ancora il passo importante verso una risposta reale: quale chiamata di funzione / metodo indica che questo sistema di eventi viene utilizzato?
Robert,

1
Aggiornata la risposta per elencare gli eventi specifici a cui probabilmente un codice potrebbe agganciarsi ... se si esegue il grep su quelli e non succede nulla, probabilmente si è al sicuro.
Jeff Widman,

12
Per la cronaca, la variabile effettiva che si desidera impostare su Vero o Falso per evitare questa stampa è app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], in cui l'app viene creata utilizzando l'app per matracciflask.Flask()
Michael Hewson,

3
In generale è vero; tuttavia se stai configurando usando un modello o file di oggetti potrebbe essere leggermente diverso ( flask.pocoo.org/docs/latest/config ). Ma se lo fai, probabilmente sai già come configurare le variabili nella tua app.
Jeff Widman,

72

La spiegazione dettagliata di Jeff Widman è semplicemente perfetta.

Dal momento che ho avuto alcune lotte copia e incolla prima di farlo bene, mi piacerebbe semplificare il prossimo che sarà nei miei panni.

Nel tuo codice, subito dopo :

app = Flask(__name__)

Se vuoi abilitare le modifiche alle tracce, aggiungi semplicemente:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

In caso contrario, se non utilizza questa funzione, è possibile che si desideri modificare il valore in False per non sprecare risorse di sistema. Ciò continuerà a mettere a tacere l'avvertimento poiché stai comunque impostando esplicitamente la configurazione.

Ecco lo stesso frammento con valore False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Grazie a Jeff Widman per questo suggerimento e dettagli aggiunti.


2
Questo è solo se si desidera effettivamente abilitare le modifiche delle tracce. Se non lo stai usando, vuoi cambiarlo in un Falsemodo da non sprecare risorse di sistema. Questo continuerà a mettere a tacere l'avvertimento poiché stai ancora impostando esplicitamente la configurazione.
Jeff Widman,

@Pitto questo è quello che stavo cercando. In effetti, il sistema di eventi SQLAlchemy è perfetto per la maggior parte di esso. Ulteriori su Flask-SQLAlchemy non hanno mai usato. Usando solo per un'app di esempio. Complimenti al team per creare un avviso di deprecazione. Davvero utile. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle

7

Le risposte sopra sembrano buone. Tuttavia, volevo sottolineare questa riga nella documentazione Flask-SQLAlchemy perché stavo ancora ricevendo questi avvisi dopo aver impostato la SQLALCHEMY_TRACK_MODIFICATIONS = Falsemia configurazione dell'applicazione.

In questa pagina: http://flask-sqlalchemy.pocoo.org/2.3/config/

I seguenti valori di configurazione esistono per Flask-SQLAlchemy. Flask-SQLAlchemy carica questi valori dalla configurazione principale di Flask che può essere popolata in vari modi. Si noti che alcuni di questi non possono essere modificati dopo la creazione del motore, quindi assicurarsi di configurarli il prima possibile e di non modificarli in fase di esecuzione.

In altre parole, assicurati di impostare il tuo app.config prima creare il database Flask-SQLAlchemy.

Ad esempio, se si sta configurando l'applicazione per impostare SQLALCHEMY_TRACK_MODIFICATIONS = False:

from flask import Flask
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
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.