Как узнать, могу ли я отключить SQLALCHEMY_TRACK_MODIFICATIONS?

136

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

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

Роберт
источник

Ответы:

175

Скорее всего, ваше приложение не использует систему событий 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 была довольно глючной (см. Проблемы, связанные с упомянутым ниже запросом на получение), что требовало дополнительного обслуживания для функции, которой пользуются немногие.

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

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

Джефф Видман
источник
1
Хорошо, мы приближаемся, но важный шаг к реальному ответу все еще отсутствует: какой вызов функции / метода указывает, что эта система событий используется?
Роберт
1
Обновлен ответ, чтобы перечислить конкретные события, с которыми, вероятно, зацепится любой код ... если вы используете grep и ничего не происходит, вы, вероятно, в безопасности.
Джефф Видман
12
Для записи, реальная переменная, которую вы хотите установить в True или False, чтобы избежать этой распечатки, - это app.config['SQLALCHEMY_TRACK_MODIFICATIONS']где приложение - это ваше приложение для колб, созданное с использованиемflask.Flask()
Michael Hewson
3
В общем, это правда; однако если вы конфигурируете, используя объектный шаблон или файл, он может немного отличаться ( flask.pocoo.org/docs/latest/config ). Но если вы делаете это, вы, вероятно, уже знаете, как настроить переменные в вашем приложении.
Джефф Видман
72

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

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

В вашем коде сразу после :

app = Flask(__name__)

Если вы хотите включить модификации треков, просто добавьте:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

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

Вот тот же фрагмент со значением False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

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

Pitto
источник
2
Это только если вы действительно хотите включить модификации трека. Если вы не используете его, вы хотите изменить его на Falseтак, чтобы не тратить системные ресурсы. Это все еще заставит замолчать предупреждение, так как вы все еще явно устанавливаете конфигурацию.
Джефф Видман
@ Питто это то, что я искал. На самом деле система событий SQLAlchemy находится на большей части. Дополнительные на Flask-SQLAlchemy никогда не использовали. Просто использую для примера приложения. Слава команде, чтобы создать предупреждение об устаревании. Действительно полезно. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] =
Неверно
7

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

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

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

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

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

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

db = SQLAlchemy(app)
jasonrhaas
источник