web-dev-qa-db-fra.com

Comment savoir si je peux désactiver SQLALCHEMY_TRACK_MODIFICATIONS?

Chaque fois que j'exécute mon application qui utilise Flask-SQLAlchemy, l'avertissement suivant s'affiche: l'option SQLALCHEMY_TRACK_MODIFICATIONS 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 savoir ce que cette option permet, mais la documentation de Flask-SQLAlchemy n'est pas claire sur l'utilisation de ce suivi.

SQLALCHEMY_TRACK_MODIFICATIONS

Si défini sur True (valeur par défaut), Flask-SQLAlchemy suivra les modifications d'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 = True ou si je peux sans risque désactiver cette fonctionnalité et économiser de la mémoire sur mon serveur?

108
Robert

Il est fort probable que votre application n'utilise pas le système d'événements Flask-SQLAlchemy. Vous pouvez donc probablement l'activer sans danger. Vous devrez vérifier le code pour vérifier - vous recherchez tout ce qui peut être relié à models_committed_ OU _before_models_committed . Si vous constatez que vous utilisez le système d'événements Flask-SQLAlchemy, vous devez probablement mettre à jour le code pour qu'il utilise plutôt le système d'événements intégré de SQLAlchemy.

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

_SQLALCHEMY_TRACK_MODIFICATIONS = False
_

dans 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 a 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_MODIFICATIONS_ vous permet de désactiver le système de suivi des modifications. Actuellement, l'option par défaut est True, mais à l'avenir, cette valeur par défaut passera à False, ce qui désactivera le système d'événements.

Pour autant que je sache, le changement a trois raisons d'être:

  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 paramètre par défaut est de le désactiver et ceux qui le souhaitent peuvent l’activer.

  2. Le système d’événement dans Flask-SQLAlchemy a été plutôt bogué (voir les problèmes liés à la demande d’attraction mentionnée ci-dessous), nécessitant une maintenance supplémentaire pour une fonctionnalité peu utilisée par les utilisateurs.

  3. Dans la version 0.7, SQLAlchemy a lui-même ajouté un système d’événements puissant , y compris la possibilité de créer des événements personnalisés. Dans l’idéal, le système d’événements Flask-SQLAlchemy ne devrait rien faire d’autre que créer quelques crochets d’événement et des écouteurs SQLAlchemy personnalisés, puis laisser SQLAlchemy gérer lui-même le déclencheur d’événement.

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

146
Jeff Widman

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

Depuis que j’ai eu quelques combats de copier/coller avant d’obtenir ce droit, je voudrais faciliter les choses pour le prochain qui sera à ma place.

Dans votre code, immédiatement après:

app = Flask(__name__)

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

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

Sinon, si vous n'utilisez pas cette fonctionnalité , vous pouvez définir la valeur sur False pour ne pas gaspiller les ressources système. Ceci mettra toujours l'avertissement en sourdine puisque vous définissez quand même explicitement la configuration.

Voici le même extrait avec la valeur False:

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

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

55
Pitto

Les réponses ci-dessus semblent bonnes. Cependant, je souhaitais souligner cette ligne dans la documentation de Flask-SQLAlchemy car je recevais toujours ces avertissements après avoir défini SQLALCHEMY_TRACK_MODIFICATIONS = False dans ma configuration d'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 Flask principale, qui peut être renseignée de différentes manières. Notez que certains d'entre eux ne peuvent plus être modifiés après la création du moteur. Veillez donc à configurer le plus tôt possible et à ne pas les modifier au moment 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)
7
jasonrhaas