web-dev-qa-db-fra.com

Flask SQLAlchemy afficher les requêtes de débogage

Je développe une application avec flask et SQL Alchemy . Je dois afficher les requêtes exécutées pour générer une page en fonction du temps nécessaire à chaque requête pour le débogage.

Quelle est la meilleure façon de le faire?

37
applechief

Je ne l'ai pas utilisé moi-même, mais il semble que la barre d'outils Flask Debug puisse vous aider.

https://github.com/mgood/flask-debugtoolbar

C'est un port de la barre d'outils Django-debug-tool, qui peut être utilisé pour les requêtes de profilage ... La documentation de la barre d'outils Flask Debug-tool ne le mentionne pas, mais il existe du code pour SQLAlchemyDebugPanel.
Je pense donc qu’il vaudrait peut-être la peine de jeter un coup d’œil sur le projet et de voir s’il répond à vos besoins.

12
jeverling

Si vous utilisez l'extension Flask et que vous ne voulez pas vous occuper de create_engine, vous pouvez définir la clé de configuration SQLALCHEMY_ECHO=True.

http://flask-sqlalchemy.pocoo.org/2.1/config/

77
Cawb07
app.config['SQLALCHEMY_ECHO'] = True
37
Peter Cotton

Réponse tardive mais la définition de "echo = True" dans votre sqlalchemy create_engine enregistrera les requêtes exécutées et l'heure.

6
user3287829

L'autre réponse ne fonctionne qu'avec flask_sqlalchemy, pas flask et sqlalchemy.

Si vous souhaitez utiliser la variable SQLAlchemy native, vous pouvez le faire rapidement: http://yuji.wordpress.com/2014/01/07/use-native-sqlalchemy-in-flask-debugtoolbar/

from flask.ext.sqlalchemy import _EngineDebuggingSignalEvents
_EngineDebuggingSignalEvents(engine, app.import_name).register()
# use at your own risk! a development environment shouldn't really care though!

Les systèmes d'extrémité explicitement/sélectionner ne fonctionnent pas sans les connecter manuellement à votre projet, mais au minimum, votre débogueur de requête (count et sql) fonctionne. J'essayais de comprendre quel genre de questions mon alchimie était en train de former, et je l'ai compris.

3

Si vous utilisez votre propre configuration de journalisation Python, vous voudrez peut-être simplement définir le niveau du consignateur 'sqlalchemy.engine' sur 'INFO' dans votre configuration .

Il existe de nombreuses façons de configurer votre journalisation Python, mais voici un exemple using logging.config.dictConfig()

import logging.config

logging.config.dictConfig({
   ...
   'loggers': {
       'sqlalchemy.engine': {
           'level': 'INFO',
           'handlers': ...
       }
   }
})
1
simlmx

Je ne suis pas sûr de pouvoir générer une page Web à partir de celle-ci, mais un bon moyen de déboguer/consigner des requêtes de base de données est d'utiliser la méthode get_debug_queries () de SQLAlchemy.

## in app/main/views.py . (my app's main endpoint file)
from flask import current_app
from flask_sqlalchemy import get_debug_queries

@main.after_app_request
def after_request(response):
    for query in get_debug_queries():
        if query.duration >= current_app.config['FLASKY_SLOW_DB_QUERY_TIME']:
            current_app.logger.warning(
                'Slow query: %s\nParameters: %s\nDuration: %fs\nContext: %s\n'
                % (query.statement, query.parameters, query.duration,
                   query.context))
    return response

Beaucoup de choses se passent ici, décomposons-les:

  • Le décorateur @after_app_request veille à ce que cette fonction soit appelée juste avant la fermeture de la demande. 
  • La fonction prend l'objet réponse de flask et effectue une itération via le retour de get_debug_queries (), qui renvoie une liste. 
  • Il vérifie la durée de chacune d’elles et les compare à une variable de configuration prédéfinie (je mets la mienne à 0,5, en secondes). 
  • Enfin, il enregistre la requête avec ses propriétés dans l'objet enregistreur de flacon standard (l'emplacement de journalisation dépend de la configuration de votre application).

N'oubliez pas de définir les variables de configuration dans votre classe de configuration config.py:

SQLALCHEMY_RECORD_QUERIES = True

FLASKY_SLOW_DB_QUERY_TIME = 0.5

1
Tyrel Kostyk

En plus de la réponse de Cawb07, qui l'a résolue pour moi, assurez-vous que DEBUG_TB_INTERCEPT_REDIRECTS est défini sur True lorsque vous interrogez avant les redirections.

0
Laurens