2015-11-16 20 views
75

Za każdym razem, gdy uruchamiam aplikację korzystającą z Flask-SQLAlchemy, pojawia się następujące ostrzeżenie, że opcja SQLALCHEMY_TRACK_MODIFICATIONS zostanie wyłączona.Skąd mam wiedzieć, czy mogę wyłączyć SQLALCHEMY_TRACK_MODIFICATIONS?

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

Próbowałem dowiedzieć się, co robi ta opcja, ale dokumentacja Kolba-SQLAlchemy nie jest jasne, co wykorzystuje tę śledzenie.

SQLALCHEMY_TRACK_MODIFICATIONS

Jeśli ustawiony jest prawdą (domyślnie) skrzynkowego SQLAlchemy śledzi modyfikacji obiektów i emitują sygnał. Wymaga to dodatkowej pamięci i może być wyłączone, jeśli nie jest potrzebne.

Jak mogę się dowiedzieć, czy mój projekt wymaga SQLALCHEMY_TRACK_MODIFICATIONS = True, czy mogę bezpiecznie wyłączyć tę funkcję i zaoszczędzić pamięć na moim serwerze?

Odpowiedz

103

Najprawdopodobniej Twoja aplikacja nie korzysta z systemu zdarzeń Flask-SQLAlchemy, więc prawdopodobnie bezpiecznie się wyłączy. Musisz zweryfikować kod, aby go zweryfikować - szukasz czegoś, co łączy się z models_committed or before_models_committed. Jeśli okaże się, że używasz systemu zdarzeń Flask-SQLAlchemy, prawdopodobnie powinieneś zaktualizować kod, aby zamiast niego używać wbudowanego systemu zdarzeń SQLAlchemy.

Aby wyłączyć system zdarzeń Kolba-sqlalchemy (i wyłączyć ostrzeżenie), wystarczy dodać:

SQLALCHEMY_TRACK_MODIFICATIONS = False 

do aplikacji domyślnej konfiguracji, aż zostanie zmieniony (najprawdopodobniej w Kolba-sqlalchemy v3).


Background - oto, co mówi ci ostrzeżenie:

Kolba-SQLAlchemy ma swój własny system powiadamiania o zdarzeniach, które dostaje warstwowa na SQLAlchemy. W tym celu śledzi modyfikacje sesji SQLAlchemy. Zajmuje to dodatkowe zasoby, dlatego opcja SQLALCHEMY_TRACK_MODIFICATIONS umożliwia wyłączenie systemu śledzenia modyfikacji. Obecnie domyślna opcja to True, ale w przyszłości ta domyślna wartość zmieni się na False, co spowoduje wyłączenie systemu zdarzeń.

O ile mi zrozumieć, uzasadnienie zmiany jest trojaki:

  1. Nie wiele osób korzysta z systemu wydarzenie skrzynkowego sqlalchemy, ale większość ludzi nie zdaje sobie sprawy mogą zaoszczędzić zasoby systemowe przez wyłączenie go. Więc domyślnym jest wyłączenie go i ci, którzy tego chcą, mogą go włączyć.

  2. System zdarzeń w Flask-SQLAlchemy był dość błędny (patrz problemy związane z żądaniem ściągania, o którym mowa poniżej), wymagający dodatkowej konserwacji dla funkcji, z której korzysta niewiele osób.

  3. W wersji v0.7 samo SQLAlchemy dodało numer powerful event system, w tym możliwość tworzenia zdarzeń niestandardowych. Idealnie byłoby, gdyby system zdarzeń Flask-SQLAlchemy nie robił nic więcej, jak tylko tworzył kilka niestandardowych haków i detektorów zdarzeń SQLAlchemy, a następnie pozwalał SQLAlchemy zarządzać wyzwalaczem zdarzeń.

Możesz zobaczyć więcej w dyskusji wokół the pull request that started triggering this warning.

+1

OK, jesteśmy już blisko, ale ważny krok w kierunku prawdziwej odpowiedzi wciąż brakuje: Jaka funkcja/metoda połączenia wskazują, że system zdarzeń jest używany? – Robert

+0

Zaktualizowałem odpowiedź, aby wyświetlić listę zdarzeń, które prawdopodobnie zostaną wciągnięte przez kod ... Jeśli pomkniesz po nich i nic nie wyjdzie, prawdopodobnie jesteś bezpieczny. –

+6

Dla rekordu rzeczywistą zmienną, która ma być ustawiona na wartość Prawda lub Fałsz, w celu uniknięcia tego wydruku jest 'app.config ['SQLALCHEMY_TRACK_MODIFICATIONS']', gdzie aplikacja to twoja aplikacja do kolb utworzona za pomocą 'flask.Flask()' –

29

Szczegółowe wyjaśnienie Jeffa Widmana jest po prostu doskonałe.

Odkąd miałem kilka bitew kopiowania i pisania, zanim uzyskałem to prawo, chciałbym ułatwić następne zadanie, które będzie w moich butach.

W kodzie, po:

app = Flask(__name__) 

Jeśli chcesz włączyć modyfikacje toru wystarczy dodać:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 

W przeciwnym razie, jeśli jesteś nie przy użyciu tej funkcji, może chcesz zmień wartość na False, aby nie marnować zasobów systemowych. Spowoduje to wyciszenie ostrzeżenia, ponieważ wyraźnie ustawiasz konfigurację.

Oto ten sam fragment z fałszywą wartość:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False 

Dzięki Jeff Widman do tego dodane sugestie i szczegóły.

+2

Jest to możliwe tylko, jeśli chcesz włączyć modyfikacje ścieżek. Jeśli go nie używasz, chcesz zmienić to na 'False', aby nie marnować zasobów systemowych. Spowoduje to wyciszenie ostrzeżenia, ponieważ nadal jawnie konfigurujesz konfigurację. –

+0

Spot on @JeffWidman! Dodano szczegóły :) – Pitto

3

Powyższe odpowiedzi wyglądają dobrze. Jednak chciałem wskazać tę linię w dokumentacji Flask-SQLAlchemy, ponieważ wciąż otrzymywałem te ostrzeżenia po ustawieniu SQLALCHEMY_TRACK_MODIFICATIONS = False w mojej konfiguracji aplikacji.

Na tej stronie: http://flask-sqlalchemy.pocoo.org/2.3/config/

następujące wartości konfiguracyjne istnieją skrzynkowego SQLAlchemy. Flask-SQLAlchemy ładuje te wartości z twojej głównej konfiguracji Flask, którą można wypełnić na różne sposoby. Zauważ, że niektóre z nich nie mogą być modyfikowane po utworzeniu silnika, więc upewnij się, że skonfigurowałeś je tak wcześnie, jak to możliwe i nie modyfikowałeś ich w czasie wykonywania.

Innymi słowy, upewnij się, aby skonfigurować tworzenie bazy danych Kolba-sqlalchemy app.configprzed.

Na przykład, jeśli konfigurowania aplikacji ustawić SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)