Як дізнатися, чи можу я відключити 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, тому ви, ймовірно, можете безпечно вимкнутись. Вам необхідно провести аудит коду для перевірки - you're шукає - небудь , що гачки в 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. У версії 0.7, SQLAlchemy додав потужну систему подій, що включає можливість створювати власні події. В ідеалі система подій Flask-SQLAlchemy не повинна робити нічого, крім створення декількох користувацьких гачків подій і слухачів SQLAlchemy, а потім нехай SQLAlchemy сам керує тригером події.

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


1
Гаразд, ми наближаємось, але важливий крок до реальної відповіді все ще відсутній: Який виклик функції / методу вказує на використання цієї системи подій?
Роберт

1
Оновлено відповідь, щоб перерахувати конкретні події, до яких, ймовірно, підключиться будь-який код ... якщо ви причепитеся до них і нічого не з'явиться, ви, ймовірно, в безпеці.
Джефф Відман

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

В іншому випадку, якщо ви не використовуєте цю функцію, ви можете змінити значення на Неправильне, щоб не витрачати системні ресурси. Це все ще заглушить попередження, оскільки ви все одно явно встановлюєте конфігурацію.

Ось той самий фрагмент з помилковим значенням:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Дякую Джеффу Відману за додані пропозиції та деталі.


2
Це лише в тому випадку, якщо ви дійсно хочете ввімкнути зміни доріжок. Якщо ви не використовуєте це, ви хочете змінити це на Falseтак, щоб не витрачати системні ресурси. Це все одно замовчуватиме попередження, оскільки ви все одно явно встановлюєте конфігурацію.
Джефф Відман

@Pitto це те, що я шукав. Дійсно, система подій SQLAlchemy є помітною для більшої частини її. Додаткові відомості про Flask-SQLAlchemy ніколи не використовували. Просто використовується для прикладної програми. Кудо команді, щоб створити попередження про недостатність. Дуже корисно. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = Неправильно
Doogle

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.