Woher weiß ich, ob ich SQLALCHEMY_TRACK_MODIFICATIONS deaktivieren kann?

136

Jedes Mal, wenn ich meine App starte, die Flask-SQLAlchemy verwendet, wird die folgende Warnung angezeigt, dass die SQLALCHEMY_TRACK_MODIFICATIONSOption deaktiviert wird.

/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.')

Ich habe versucht herauszufinden, was diese Option bewirkt, aber in der Flask-SQLAlchemy-Dokumentation ist nicht klar, wie dieses Tracking verwendet wird.

SQLALCHEMY_TRACK_MODIFICATIONS

Bei der Einstellung True (Standardeinstellung) verfolgt Flask-SQLAlchemy Änderungen von Objekten und sendet Signale aus. Dies erfordert zusätzlichen Speicher und kann deaktiviert werden, wenn er nicht benötigt wird.

Wie finde ich heraus, ob mein Projekt dies erfordert SQLALCHEMY_TRACK_MODIFICATIONS = Trueoder ob ich diese Funktion sicher deaktivieren und Speicher auf meinem Server speichern kann?

Robert
quelle

Antworten:

175

Höchstwahrscheinlich verwendet Ihre Anwendung das Flask-SQLAlchemy-Ereignissystem nicht, sodass Sie es wahrscheinlich sicher ausschalten können. Sie müssen den Code überprüfen, um zu überprüfen, ob Sie nach etwas suchen, das sich in models_committedoderbefore_models_committed einfügt . Wenn Sie feststellen, dass Sie das Flask-SQLAlchemy-Ereignissystem verwenden, sollten Sie den Code wahrscheinlich aktualisieren, um stattdessen das integrierte Ereignissystem von SQLAlchemy zu verwenden.

Fügen Sie einfach Folgendes hinzu, um das Flask-SQLAlchemy-Ereignissystem auszuschalten (und die Warnung zu deaktivieren):

SQLALCHEMY_TRACK_MODIFICATIONS = False

zu Ihrer App-Konfiguration, bis die Standardeinstellung geändert wird (höchstwahrscheinlich in Flask-SQLAlchemy v3).


Hintergrund - die Warnung sagt Ihnen Folgendes:

Flask-SQLAlchemy verfügt über ein eigenes Ereignisbenachrichtigungssystem, das über SQLAlchemy gelegt wird. Zu diesem Zweck werden Änderungen an der SQLAlchemy-Sitzung verfolgt. Dies SQLALCHEMY_TRACK_MODIFICATIONSerfordert zusätzliche Ressourcen, sodass Sie mit dieser Option das Änderungsverfolgungssystem deaktivieren können. Derzeit wird standardmäßig die Option verwendet True, in Zukunft wird diese Standardeinstellung jedoch geändert False, wodurch das Ereignissystem deaktiviert wird.

Soweit ich weiß, gibt es drei Gründe für die Änderung:

  1. Nicht viele Leute verwenden das Ereignissystem von Flask-SQLAlchemy, aber die meisten Leute wissen nicht, dass sie Systemressourcen sparen können, indem sie es deaktivieren. Ein vernünftigerer Standard ist es also, es zu deaktivieren, und diejenigen, die es wollen, können es einschalten.

  2. Das Ereignissystem in Flask-SQLAlchemy war ziemlich fehlerhaft (siehe Probleme in der unten genannten Pull-Anforderung) und erforderte zusätzliche Wartung für eine Funktion, die nur wenige Benutzer verwenden.

  3. In Version 0.7 hat SQLAlchemy selbst ein leistungsstarkes Ereignissystem hinzugefügt , einschließlich der Möglichkeit, benutzerdefinierte Ereignisse zu erstellen. Im Idealfall sollte das Flask-SQLAlchemy-Ereignissystem lediglich einige benutzerdefinierte SQLAlchemy-Ereignis-Hooks und -Listener erstellen und dann SQLAlchemy den Ereignisauslöser selbst verwalten lassen.

Weitere Informationen finden Sie in der Diskussion um die Pull-Anforderung, die diese Warnung ausgelöst hat .

Jeff Widman
quelle
1
OK, wir nähern uns, aber der wichtige Schritt zu einer echten Antwort fehlt noch: Welcher Funktions- / Methodenaufruf zeigt an, dass dieses Ereignissystem verwendet wird?
Robert
1
Die Antwort wurde aktualisiert, um die spezifischen Ereignisse aufzulisten, in die sich ein Code wahrscheinlich einklinken würde. Wenn Sie sich mit diesen befassen und nichts auftaucht, sind Sie wahrscheinlich sicher.
Jeff Widman
12
Für den Datensatz ist die tatsächliche Variable, die Sie auf Richtig oder Falsch setzen möchten, um diesen Ausdruck zu vermeiden app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], wobei App Ihre Kolben-App ist, die mitflask.Flask()
Michael Hewson
3
Im Allgemeinen ist das wahr; Wenn Sie jedoch mithilfe eines Objektmusters oder einer Datei konfigurieren, kann dies etwas anders sein ( flask.pocoo.org/docs/latest/config ). Aber wenn Sie das tun, wissen Sie wahrscheinlich bereits, wie Sie Variablen in Ihrer App konfigurieren.
Jeff Widman
72

Jeff Widmans detaillierte Erklärung ist einfach perfekt.

Da ich einige Copy'n'Paste-Kämpfe hatte, bevor ich das richtig hinbekam, möchte ich es dem nächsten leichter machen, der in meinen Schuhen sein wird.

In Ihrem Code unmittelbar danach :

app = Flask(__name__)

Wenn Sie Spuränderungen aktivieren möchten, fügen Sie einfach Folgendes hinzu:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Wenn Sie diese Funktion nicht verwenden, möchten Sie möglicherweise den Wert in "Falsch" ändern, um keine Systemressourcen zu verschwenden. Dadurch wird die Warnung weiterhin stummgeschaltet, da Sie die Konfiguration ohnehin explizit festlegen.

Hier ist das gleiche Snippet mit dem Wert False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Vielen Dank an Jeff Widman für diesen zusätzlichen Vorschlag und Details.

Pitto
quelle
2
Dies ist nur möglich, wenn Sie tatsächlich Spuränderungen aktivieren möchten. Wenn Sie es nicht verwenden, möchten Sie es in a ändern, Falsedamit Sie keine Systemressourcen verschwenden. Dadurch wird die Warnung weiterhin stummgeschaltet, da Sie die Konfiguration weiterhin explizit festlegen.
Jeff Widman
@Pitto das ist was ich gesucht habe. Tatsächlich ist das SQLAlchemy-Ereignissystem zum größten Teil genau richtig. Zusätzliche auf Flask-SQLAlchemy haben noch nie verwendet. Nur für eine Beispiel-App verwenden. Ein großes Lob an das Team für die Erstellung einer Abwertungswarnung. Wirklich hilfreich. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle
7

Die obigen Antworten sehen gut aus. Ich wollte jedoch in der Flask-SQLAlchemy-Dokumentation auf diese Zeile hinweisen, da ich diese Warnungen nach dem Einstellen SQLALCHEMY_TRACK_MODIFICATIONS = Falsein meiner Anwendungskonfiguration immer noch erhielt .

Auf dieser Seite: http://flask-sqlalchemy.pocoo.org/2.3/config/

Die folgenden Konfigurationswerte existieren für Flask-SQLAlchemy. Flask-SQLAlchemy lädt diese Werte aus Ihrer Haupt-Flask-Konfiguration, die auf verschiedene Arten ausgefüllt werden kann. Beachten Sie, dass einige davon nach dem Erstellen der Engine nicht mehr geändert werden können. Konfigurieren Sie sie daher so früh wie möglich und ändern Sie sie nicht zur Laufzeit.

Mit anderen Worten, stellen Sie sicher, dass Sie Ihre einrichten, app.config bevor Sie Ihre Flask-SQLAlchemy-Datenbank erstellen.

Wenn Sie beispielsweise Ihre Anwendung so konfigurieren, dass Folgendes festgelegt wird SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
jasonrhaas
quelle