it-swarm.com.de

Woher weiß ich, ob ich SQLALCHEMY_TRACK_MODIFICATIONS deaktivieren kann?

Jedes Mal, wenn ich meine App mit Flask-SQLAlchemy starte, erhalte ich die folgende Warnung, dass das SQLALCHEMY_TRACK_MODIFICATIONS Option wird deaktiviert.

/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 Dokumentation zu Flask-SQLAlchemy ist nicht klar, wozu dieses Tracking verwendet wird.

SQLALCHEMY_TRACK_MODIFICATIONS

Wenn True (die Standardeinstellung) festgelegt ist, verfolgt Flask-SQLAlchemy Änderungen an Objekten und sendet Signale aus. Dies erfordert zusätzlichen Speicher und kann deaktiviert werden, wenn dies nicht benötigt wird.

Wie finde ich heraus, ob für mein Projekt SQLALCHEMY_TRACK_MODIFICATIONS = True oder ob ich diese Funktion sicher deaktivieren und Speicher auf meinem Server sparen kann?

108
Robert

Höchstwahrscheinlich verwendet Ihre Anwendung das Flask-SQLAlchemy-Ereignissystem nicht. Sie können es also sicher deaktivieren. Sie müssen den Code überprüfen, um zu überprüfen - Sie suchen nach etwas, das sich einhakt models_committed Oder before_models_committed . 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.

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

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 protokolliert. Dies erfordert zusätzliche Ressourcen, sodass Sie mit der Option SQLALCHEMY_TRACK_MODIFICATIONS Das Änderungsverfolgungssystem deaktivieren können. Derzeit ist die Standardeinstellung True. In Zukunft ändert sich diese Standardeinstellung jedoch in 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 durch Deaktivieren Systemressourcen sparen können. Daher ist es eine vernünftige Vorgabe, es zu deaktivieren, und diejenigen, die es möchten, können es aktivieren.

  2. Das Ereignissystem in Flask-SQLAlchemy war ziemlich fehlerhaft (siehe Probleme, die in der unten erwähnten Pull-Anforderung aufgeführt sind) 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, mit dem benutzerdefinierte Ereignisse erstellt werden können. Im Idealfall sollte das Flask-SQLAlchemy-Ereignissystem nur ein paar benutzerdefinierte SQLAlchemy-Ereignis-Hooks und -Listener erstellen und dann SQLAlchemy den Ereignisauslöser selbst überlassen.

Sie können mehr in der Diskussion um die Pull-Anforderung sehen, die diese Warnung ausgelöst hat .

146
Jeff Widman

Jeff Widmans detaillierte Erklärung ist einfach perfekt.

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

In Ihrem Code nmittelbar danach:

app = Flask(__name__)

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Andernfalls möchten Sie, wenn Sie diese Funktion nicht verwenden , möglicherweise den Wert auf False ä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 falschem Wert:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

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

55
Pitto

Die obigen Antworten sehen gut aus. Ich wollte jedoch auf diese Zeile in der Flask-SQLAlchemy-Dokumentation hinweisen, da ich nach dem Festlegen von SQLALCHEMY_TRACK_MODIFICATIONS = False In meiner Anwendungskonfiguration immer noch diese Warnungen 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 Hauptkonfiguration Flask config, die auf verschiedene Arten ausgefüllt werden kann. Beachten Sie, dass einige dieser Werte nach der Erstellung der Engine nicht mehr geändert werden können. Stellen Sie daher sicher, dass Sie sie so früh wie möglich konfigurieren und nicht zur Laufzeit zu ändern.

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

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

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

db = SQLAlchemy(app)
7
jasonrhaas