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

Каждый раз, когда я запускаю свое приложение, использующее 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

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

В вашем коде, после:

app = Flask(__name__)

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

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

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

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

Ответ 3

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

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

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

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

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

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

db = SQLAlchemy(app)