web-dev-qa-db-fra.com

Débogage (affichage) de la commande SQL envoyée à la base de données par SQLAlchemy

J'ai une classe ORM appelée Person, qui s'enroule autour d'une table person:

Après avoir configuré la connexion à la base de données, etc., j'exécute l'instruction ff.

people = session.query (Person) .all ()

La table person ne contient pas de données (pour l'instant), donc quand j'imprime la variable people, j'obtiens une liste vide.

J'ai renommé la table référencée dans ma classe ORM People, en people_foo (qui n'existe pas).

Je lance ensuite à nouveau le script. J'ai été surpris qu'aucune exception n'ait été levée lors de la tentative d'accès à une table qui n'existe pas.

J'ai donc les 2 questions suivantes:

  1. Comment puis-je configurer SQLAlchemy pour qu'il propage les erreurs db au script?
  2. Comment puis-je afficher (c'est-à-dire imprimer) le SQL envoyé au moteur de base de données

Si cela aide, j'utilise PostgreSQL comme db

[Modifier]

J'écris un paquet. Dans mon __main__.py script, j'ai le code suivant (raccourci ici):

### __main__.py
import common # imports logging and defines logging setup funcs etc

logger = logging.getLogger(__name__)


def main():    
    parser = OptionParser(usage="%prog [options] <commands>",
                          version="%prog 1.0")

    commands = OptionGroup(parser, "commands")

    parser.add_option(
        "-l",
        "--logfile",
        dest="logfile",
        metavar="FILE",
        help="log to FILE. if not set, no logging will be done"
    )

    parser.add_option(
        "--level",
        dest="loglevel",
        metavar="LOG LEVEL",
        help="Debug level. if not set, level will default to low"
    )

    # Set defaults if not specified
    if not options.loglevel:
        loglevel = 1
    else:
        loglevel = options.loglevel

    if not options.logfile:
        logfilename = 'datafeed.log'
    else:
        logfilename = options.logfile

    common.setup_logger(False, logfilename, loglevel) 

       # and so on ...



        #### dbfuncs.py


import logging

    # not sure how to 'bind' to the logger in __main__.py
    logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

    engine = create_engine('postgres://postgres:pwd@localhost:port/dbname', echo=True)

[Modifier2]

le module commun configure correctement l'enregistreur et je peux utiliser l'enregistreur dans mes autres modules qui importent en commun.

Cependant, dans le module dbfuncs, j'obtiens l'erreur/l'avertissement suivant:

Aucun gestionnaire n'a été trouvé pour l'enregistreur "sqlalchemy.engine.base.Engine

74
morpheous

En plus du paramètre echo de create_engine(), il existe un moyen plus flexible: configurer logging pour faire écho aux instructions du moteur:

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

Voir Configuration de la journalisation section de la documentation pour plus d'informations.

167
Denis Otkidach

Vous pouvez voir les instructions SQL envoyées à la base de données en passant echo = True lorsque l'instance de moteur est créée (généralement en utilisant l'appel create_engine () ou engine_from_config () dans votre code).

Par exemple:

engine = sqlalchemy.create_engine('postgres://foo/bar', echo=True)

Par défaut, les instructions enregistrées vont à stdout.

69
Menno Smits