Comment savoir si je peux désactiver SQLALCHEMY_TRACK_MODIFICATIONS?

136

Chaque fois que j'exécute mon application qui utilise Flask-SQLAlchemy, je reçois l'avertissement suivant indiquant que l' SQLALCHEMY_TRACK_MODIFICATIONSoption sera désactivée.

/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.')

J'ai essayé de découvrir ce que fait cette option, mais la documentation Flask-SQLAlchemy n'est pas claire sur ce qui utilise ce suivi.

SQLALCHEMY_TRACK_MODIFICATIONS

S'il est défini sur True (valeur par défaut), Flask-SQLAlchemy suivra les modifications des objets et émettra des signaux. Cela nécessite de la mémoire supplémentaire et peut être désactivé s'il n'est pas nécessaire.

Comment savoir si mon projet nécessite SQLALCHEMY_TRACK_MODIFICATIONS = Trueou si je peux désactiver en toute sécurité cette fonctionnalité et économiser de la mémoire sur mon serveur?

Robert
la source

Réponses:

175

Il est fort probable que votre application n'utilise pas le système d'événements Flask-SQLAlchemy, vous pouvez donc probablement la désactiver en toute sécurité. Vous devrez auditer le code pour vérifier - vous recherchez tout ce qui se connecte à models_committedoubefore_models_committed . Si vous constatez que vous utilisez le système d'événements Flask-SQLAlchemy, vous devriez probablement mettre à jour le code pour utiliser le système d'événements intégré de SQLAlchemy à la place.

Pour désactiver le système d'événements Flask-SQLAlchemy (et désactiver l'avertissement), ajoutez simplement:

SQLALCHEMY_TRACK_MODIFICATIONS = False

à la configuration de votre application jusqu'à ce que la valeur par défaut soit modifiée (très probablement dans Flask-SQLAlchemy v3).


Contexte - voici ce que l'avertissement vous dit:

Flask-SQLAlchemy dispose de son propre système de notification d'événements qui se superpose à SQLAlchemy. Pour ce faire, il suit les modifications apportées à la session SQLAlchemy. Cela prend des ressources supplémentaires, donc l'option SQLALCHEMY_TRACK_MODIFICATIONSvous permet de désactiver le système de suivi des modifications. Actuellement, l'option est définie par défaut sur True, mais à l'avenir, cette valeur par défaut deviendra False, désactivant ainsi le système d'événements.

Pour autant que je sache, la justification du changement est triple:

  1. Peu de gens utilisent le système d'événements de Flask-SQLAlchemy, mais la plupart des gens ne réalisent pas qu'ils peuvent économiser des ressources système en le désactivant. Donc, un défaut plus sain est de le désactiver et ceux qui le veulent peuvent l'activer.

  2. Le système d'événements dans Flask-SQLAlchemy a été plutôt bogué (voir les problèmes liés dans la demande d'extraction mentionnée ci-dessous), nécessitant une maintenance supplémentaire pour une fonctionnalité que peu de gens utilisent.

  3. Dans la v0.7, SQLAlchemy lui-même a ajouté un système d'événements puissant comprenant la possibilité de créer des événements personnalisés. Idéalement, le système d'événements Flask-SQLAlchemy ne devrait rien faire d'autre que créer quelques hooks et écouteurs d'événement SQLAlchemy personnalisés, puis laisser SQLAlchemy gérer lui-même le déclencheur d'événement.

Vous pouvez en savoir plus dans la discussion sur la demande d'extraction qui a commencé à déclencher cet avertissement .

Jeff Widman
la source
1
OK, nous nous rapprochons, mais l'étape importante vers une vraie réponse est toujours manquante: quel appel de fonction / méthode indique que ce système d'événements est utilisé?
Robert
1
Mise à jour de la réponse pour lister les événements spécifiques auxquels n'importe quel code serait probablement connecté ... si vous grepez sur ceux-ci et que rien ne se produit, vous êtes probablement en sécurité.
Jeff Widman
12
Pour mémoire, la variable réelle que vous souhaitez définir sur True ou False pour éviter cette impression est app.config['SQLALCHEMY_TRACK_MODIFICATIONS'], où app est votre application flask créée à l'aide deflask.Flask()
Michael Hewson
3
En général, c'est vrai; cependant, si vous configurez à l'aide d'un modèle d'objet ou d'un fichier, cela peut être un peu différent ( flask.pocoo.org/docs/latest/config ). Mais si vous faites cela, vous savez probablement déjà comment configurer des variables dans votre application.
Jeff Widman
72

L'explication détaillée de Jeff Widman est tout simplement parfaite.

Comme j'ai eu des combats de copier-coller avant de réussir, j'aimerais faciliter la tâche pour le prochain qui sera à ma place.

Dans votre code, immédiatement après :

app = Flask(__name__)

Si vous souhaitez activer les modifications de suivi, ajoutez simplement:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Sinon, si vous n'utilisez pas cette fonctionnalité, vous souhaiterez peut-être modifier la valeur sur False afin de ne pas gaspiller les ressources système. Cela fera toujours taire l'avertissement puisque vous définissez de toute façon explicitement la configuration.

Voici le même extrait de code avec la valeur False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Merci à Jeff Widman pour cette suggestion et ces détails supplémentaires.

Pitto
la source
2
Ce n'est que si vous souhaitez réellement activer les modifications de suivi. Si vous ne l'utilisez pas, vous souhaitez le remplacer par un Falseafin de ne pas gaspiller les ressources système. Cela fera toujours taire l'avertissement puisque vous définissez toujours explicitement la configuration.
Jeff Widman
@Pitto c'est ce que je cherchais. En effet, le système d'événements SQLAlchemy est parfait pour la plupart. Supplémentaire sur Flask-SQLAlchemy n'ont jamais utilisé. Utilisation juste pour un exemple d'application. Félicitations à l'équipe pour créer un avertissement de désapprobation. Très utile. app.config ['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Doogle
7

Les réponses ci-dessus semblent bonnes. Cependant, je voulais souligner cette ligne dans la documentation Flask-SQLAlchemy car je recevais toujours ces avertissements après avoir défini SQLALCHEMY_TRACK_MODIFICATIONS = Falsedans la configuration de mon application.

Sur cette page: http://flask-sqlalchemy.pocoo.org/2.3/config/

Les valeurs de configuration suivantes existent pour Flask-SQLAlchemy. Flask-SQLAlchemy charge ces valeurs à partir de votre configuration principale Flask qui peut être renseignée de différentes manières. Notez que certains d'entre eux ne peuvent pas être modifiés après la création du moteur, assurez-vous donc de les configurer le plus tôt possible et de ne pas les modifier lors de l'exécution.

En d'autres termes, assurez-vous de configurer votre app.config avant de créer votre base de données Flask-SQLAlchemy.

Par exemple, si vous configurez votre application pour définir SQLALCHEMY_TRACK_MODIFICATIONS = False:

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

db = SQLAlchemy(app)
jasonrhaas
la source