Comment savoir si je peux désactiver SQLALCHEMY_TRACK_MODIFICATIONS?

Chaque fois que je lance mon application utilisant Flask-SQLAlchemy, je reçois l’avertissement suivant que l’option SQLALCHEMY_TRACK_MODIFICATIONS est 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 fait, mais la documentation Flask-SQLAlchemy ne précise pas ce qui utilise ce suivi.

SQLALCHEMY_TRACK_MODIFICATIONS

Si défini sur True (valeur par défaut), Flask-SQLAlchemy suivra les modifications des objects 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 désactiver cette fonctionnalité en toute sécurité et économiser de la mémoire sur mon serveur?

Il est fort probable que votre application n’utilise pas le système d’événements Flask-SQLAlchemy, vous pouvez donc probablement désactiver le système. Vous devez vérifier le code pour vérifier – vous recherchez tout ce qui se models_committed à models_committed ou before_models_committed . Si vous trouvez 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 (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 est superposé à SQLAlchemy. Pour ce faire, il suit les modifications apscopes à 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 deviendra False , ce qui désactivera le système d’événements.

Pour autant que je sache, la raison d’être du changement est sortingple:

  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 de Flask-SQLAlchemy a été plutôt bogué (voir les problèmes liés à la demande de pullup ci-dessous), nécessitant une maintenance supplémentaire pour une fonctionnalité peu utilisée.

  3. Dans la v0.7, SQLAlchemy lui-même ajoutait un puissant système d’événements incluant la possibilité de créer des événements personnalisés. Idéalement, le système d’événements Flask-SQLAlchemy ne devrait rien faire de plus que créer quelques hooks et écouteurs d’événements 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 requête d’extraction qui a déclenché cet avertissement .

Les explications détaillées de Jeff Widman sont tout simplement parfaites.

Comme je me suis battu avant d’obtenir ce droit, je voudrais que ce soit plus facile pour le prochain qui sera dans mes chaussures.

Dans votre code, 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 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 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.

Les réponses ci-dessus sont bonnes. Cependant, je voulais souligner cette ligne dans la documentation Flask-SQLAlchemy car je SQLALCHEMY_TRACK_MODIFICATIONS = False 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 depuis votre configuration principale Flask qui peut être remplie de différentes manières. Notez que certaines d’entre elles ne peuvent pas être modifiées après la création du moteur. Veillez donc à configurer le plus tôt possible et à ne pas les modifier à l’exécution.

En d’autres termes, assurez-vous de configurer votre app.config avant de créer votre firebase database 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)