Skąd mam wiedzieć, czy mogę wyłączyć SQLALCHEMY_TRACK_MODIFICATIONS?

136

Za każdym razem, gdy uruchamiam aplikację korzystającą z Flask-SQLAlchemy, otrzymuję następujące ostrzeżenie, że SQLALCHEMY_TRACK_MODIFICATIONSopcja zostanie wyłączona.

/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 Flask-SQLAlchemy nie jest jasna, co używa tego śledzenia.

SQLALCHEMY_TRACK_MODIFICATIONS

Jeśli ustawiona na True (wartość domyślna), Flask-SQLAlchemy będzie śledzić modyfikacje obiektów i emitować sygnały. Wymaga to dodatkowej pamięci i można je wyłączyć, jeśli nie jest potrzebne.

Jak mogę się dowiedzieć, czy mój projekt tego wymaga SQLALCHEMY_TRACK_MODIFICATIONS = Truelub czy mogę bezpiecznie wyłączyć tę funkcję i oszczędzać pamięć na moim serwerze?

Robert
źródło

Odpowiedzi:

175

Najprawdopodobniej Twoja aplikacja nie używa systemu zdarzeń Flask-SQLAlchemy, więc prawdopodobnie możesz bezpiecznie wyłączyć. Będziesz musiał przeprowadzić audyt kodu, aby zweryfikować - szukasz wszystkiego, co łączy się z models_committedlubbefore_models_committed . Jeśli okaże się, że używasz systemu zdarzeń Flask-SQLAlchemy, prawdopodobnie powinieneś zaktualizować kod, aby zamiast tego korzystał z wbudowanego systemu zdarzeń SQLAlchemy.

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

SQLALCHEMY_TRACK_MODIFICATIONS = False

do konfiguracji aplikacji, aż do zmiany wartości domyślnej (najprawdopodobniej we Flask-SQLAlchemy v3).


Tło - oto, co mówi ostrzeżenie:

Flask-SQLAlchemy ma własny system powiadamiania o zdarzeniach, który jest nakładany na SQLAlchemy. Aby to zrobić, śledzi modyfikacje sesji SQLAlchemy. Wymaga to dodatkowych zasobów, więc opcja SQLALCHEMY_TRACK_MODIFICATIONSumożliwia wyłączenie systemu śledzenia modyfikacji. Obecnie opcja jest domyślnie ustawiona na True, ale w przyszłości ta wartość domyślna zmieni się na False, co spowoduje wyłączenie systemu zdarzeń.

O ile rozumiem, uzasadnienie zmiany jest trojakie:

  1. Niewiele osób korzysta z systemu zdarzeń Flask-SQLAlchemy, ale większość ludzi nie zdaje sobie sprawy, że mogą oszczędzać zasoby systemowe, wyłączając go. Więc rozsądniejszym domyślnym rozwiązaniem jest wyłączenie go, a ci, którzy chcą, mogą go włączyć.

  2. System zdarzeń we Flask-SQLAlchemy był raczej wadliwy (zobacz problemy związane z żądaniem ściągnięcia wymienionym poniżej), wymagając dodatkowej konserwacji funkcji, z której korzysta niewiele osób.

  3. W wersji 0.7 sam SQLAlchemy dodał potężny system zdarzeń, w tym możliwość tworzenia niestandardowych zdarzeń. Idealnie byłoby, gdyby system zdarzeń Flask-SQLAlchemy nie robił nic poza utworzeniem kilku niestandardowych punktów zaczepienia i nasłuchiwania zdarzeń SQLAlchemy, a następnie pozwolił SQLAlchemy samodzielnie zarządzać wyzwalaczem zdarzenia.

Możesz zobaczyć więcej w dyskusji na temat żądania ściągnięcia, które zaczęło wywoływać to ostrzeżenie .

Jeff Widman
źródło
1
OK, zbliżamy się, ale wciąż brakuje ważnego kroku w kierunku prawdziwej odpowiedzi: Jakie wywołanie funkcji / metody wskazuje, że ten system zdarzeń jest używany?
Robert
1
Zaktualizowałem odpowiedź, aby wymienić konkretne zdarzenia, do których prawdopodobnie dołączyłby dowolny kod ... jeśli grep na nich nic nie wyjdzie, prawdopodobnie jesteś bezpieczny.
Jeff Widman
12
Dla przypomnienia, rzeczywistą zmienną, którą chcesz ustawić na True lub False, aby uniknąć tego wydruku, jest app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], gdzie aplikacja jest twoją aplikacją do kolby utworzoną przy użyciuflask.Flask()
Michael Hewson
3
Ogólnie to prawda; jednak jeśli konfigurujesz przy użyciu wzorca obiektu lub pliku, może to być trochę inne ( flask.pocoo.org/docs/latest/config ). Ale jeśli to robisz, prawdopodobnie wiesz już, jak skonfigurować zmienne w swojej aplikacji.
Jeff Widman,
72

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

Ponieważ miałem kilka walk typu `` kopiuj i wklej '', zanim zrobiłem to dobrze, chciałbym ułatwić następną, która będzie w moich butach.

W Twoim kodzie, zaraz po :

app = Flask(__name__)

Jeśli chcesz włączyć modyfikacje toru, po prostu dodaj:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

W przeciwnym razie, jeśli nie używasz tej funkcji, możesz chcieć zmienić wartość na False, aby nie marnować zasobów systemowych. Spowoduje to wyciszenie ostrzeżenia, ponieważ i tak jawnie ustawiasz config.

Oto ten sam fragment z wartością False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Podziękowania dla Jeffa Widmana za tę dodatkową sugestię i szczegóły.

Pitto
źródło
2
Dzieje się tak tylko wtedy, gdy faktycznie chcesz włączyć modyfikacje ścieżek. Jeśli go nie używasz, chcesz to zmienić na, aby Falsenie marnować zasobów systemowych. Spowoduje to wyciszenie ostrzeżenia, ponieważ nadal jawnie ustawiasz plik config.
Jeff Widman
@Pitto to jest to, czego szukałem. Rzeczywiście, system zdarzeń SQLAlchemy jest w większości na miejscu. Dodatkowo na Flask-SQLAlchemy nigdy nie używaliśmy. Używam tylko do przykładowej aplikacji. Wyrazy uznania dla zespołu za utworzenie ostrzeżenia o wycofaniu. Naprawdę pomocny. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle
7

Powyższe odpowiedzi wyglądają dobrze. Chciałem jednak zwrócić uwagę na ten wiersz w dokumentacji Flask-SQLAlchemy, ponieważ nadal otrzymywałem te ostrzeżenia po ustawieniu SQLALCHEMY_TRACK_MODIFICATIONS = Falsew konfiguracji mojej aplikacji.

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

Istnieją następujące wartości konfiguracyjne dla Flask-SQLAlchemy. Flask-SQLAlchemy ładuje te wartości z 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 pamiętaj, aby skonfigurować jak najwcześniej i nie modyfikować ich w czasie wykonywania.

Innymi słowy, upewnij się, że skonfigurowałeś swoją bazę danych app.config przed utworzeniem bazy danych Flask-SQLAlchemy.

Na przykład, jeśli konfigurujesz aplikację, aby ustawić SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
jasonrhaas
źródło