Как узнать, можно ли отключить изменения трека SQLALCHEMY?


каждый раз, когда я запускаю свое приложение, которое использует Flask-SQLAlchemy я получаю следующее предупреждение, что 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.')

Я попытался выяснить, что делает этот параметр, но в документации Flask-SQLAlchemy не ясно, что использует это отслеживание.

SQLALCHEMY_TRACK_MODIFICATIONS

если установлено значение True (по умолчанию) колба-SQLAlchemy будет отслеживать изменения объектов и излучать сигналы. Это требует дополнительной памяти и может быть отключено, если нет необходимый.

как мне узнать, если мой проект требует SQLALCHEMY_TRACK_MODIFICATIONS = True или если я могу спокойно отключить эту функцию и сохранить память на моем сервере?

3 89

3 ответа:

скорее всего, ваше приложение не использует систему событий Flask-SQLAlchemy, поэтому вы, вероятно, можете отключить ее. Вам нужно будет проверить код, чтобы проверить--вы ищете все, что подключается к models_committed или before_models_committed. Если вы обнаружите, что используете систему событий Flask-SQLAlchemy, вам, вероятно, следует обновить код для использования встроенной системы событий SQLAlchemy.

чтобы отключить систему событий Flask-SQLAlchemy (и отключить предупреждение), просто добавить:

SQLALCHEMY_TRACK_MODIFICATIONS = False

в конфигурацию вашего приложения, пока не изменится значение по умолчанию (скорее всего, в Flask-SQLAlchemy v3).


фон-вот что говорит вам предупреждение:

Flask-SQLAlchemy имеет свою собственную систему уведомления о событиях, которая накладывается поверх SQLAlchemy. Для этого он отслеживает изменения в сеансе SQLAlchemy. Это требует дополнительных ресурсов, поэтому вариант SQLALCHEMY_TRACK_MODIFICATIONS позволяет отключить систему отслеживания изменений. В настоящее время параметр по умолчанию True, но в будущем это значение по умолчанию изменится на False, тем самым отключив систему событий.

насколько я понимаю, обоснование для изменения в три раза:

  1. не многие люди используют систему событий Flask-SQLAlchemy, но большинство людей не понимают, что они могут сэкономить системные ресурсы, отключив его. Таким образом, более разумное значение по умолчанию-отключить его, и те, кто этого хочет, могут включить его.

  2. система событий в Flask-SQLAlchemy был довольно глючным (см. проблемы, связанные с указанным ниже запросом pull), требующим дополнительного обслуживания для функции, которую мало кто использует.

  3. в v0. 7, SQLAlchemy сам добавил мощная система событие включая возможность создания пользовательских событий. В идеале, система событий Flask-SQLAlchemy должна не делать ничего, кроме создания нескольких пользовательских крючков событий SQLAlchemy и прослушивателей, а затем позволить SQLAlchemy самому управлять триггер события.

вы можете увидеть больше в обсуждении вокруг запрос на вытягивание, который начал вызывать это предупреждение.

подробное объяснение Джеффа Уидмана просто идеально.

Так как у меня были некоторые copy'n'paste бои, прежде чем получить это право, я хотел бы сделать его легче для следующего, который будет на моем месте.

в коде, сразу после:

app = Flask(__name__)

Если вы хотите включить изменения трека просто добавить:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

в противном случае, если вы не не используя эту функцию, вы можете изменить значение на False, чтобы не отходы системных ресурсов. Это все равно заставит замолчать предупреждение, так как вы в любом случае явно устанавливаете конфигурацию.

вот тот же фрагмент с ложным значением:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

спасибо Джеффу Уидмана для этого добавил предложение и детали.

приведенные выше ответы выглядят хорошо. Однако я хотел указать эту строку в документации Flask-SQLAlchemy, потому что я все еще получал эти предупреждения после установки SQLALCHEMY_TRACK_MODIFICATIONS = False в моей конфигурации приложения.

на этой странице: http://flask-sqlalchemy.pocoo.org/2.3/config/

для Flask-SQLAlchemy существуют следующие значения конфигурации. Flask-SQLAlchemy загружает эти значения из вашей основной конфигурации колбы, которая может быть заполнена в различных пути. Обратите внимание, что некоторые из них не могут быть изменены после создания движка, поэтому убедитесь, что настроить как можно раньше и не изменять их во время выполнения.

другими словами, убедитесь, что вы настроили app.configдо создание базы данных Flask-SQLAlchemy.

например, если вы настраиваете приложение для установки SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)