2010-06-01 5 views
54

Ich habe eine ORM-Klasse namens Person, die sich um eine Person Tisch hüllt:Debugging (Anzeige) SQL-Befehl an die DB von SQLAlchemy gesendet

Nach der Verbindung zum db usw. einrichten, ich die ff-Anweisung ausführen.

Menschen = session.query (Person) .Alle()

Die Person Tabelle keine Daten enthält (noch), so dass, wenn ich die Variable Menschen zu drucken, ich eine leere Liste erhalten.

Ich benannte die Tabelle in meiner ORM-Klasse People umbenannt, um people_foo (die nicht existiert).

Ich dann das Skript erneut ausführen. Ich war überrascht, dass beim Versuch, auf eine nicht existierende Tabelle zuzugreifen, keine Ausnahme ausgelöst wurde.

Ich hat daher die folgenden zwei Fragen:

  1. Wie kann ich ein Setup SQLAlchemy, so dass es db Fehler zurück an das Skript ausbreitet?
  2. Wie kann ich sehen (dh Druck), um die SQL, die an die DB-Engine gesendet wird

Wenn es hilft, ich bin mit PostgreSQL als db

[Bearbeiten]

Ich schreibe ein Paket. In meinem __main__.py Skript habe ich den folgenden Code (hier gekürzt):

### __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:[email protected]:port/dbname', echo=True) 

[Edit2]

gemeinsames Modul setzt den Logger richtig dargestellt wird, und ich kann den Logger in meinem anderen Module verwenden, die Import allgemein.

jedoch in dbfuncs Modul, erhalte ich die folgende Fehlermeldung/Warnung:

Keine Handler für Logger „sqlalchemy.engine.base.Engine

+0

Einrückung des Codes ist kaputt, ich sehe keinen 'common.setup_logger()' Aufruf (vorausgesetzt, er konfiguriert die Protokollierung korrekt) hier. Außerdem brauchen Sie bei Verwendung der Protokollierung nicht 'echo = True'. –

+0

@denis: Ja, der Logger ist korrekt im gemeinsamen Modul eingerichtet - ich kann andere Module anmelden. Für das Modul dbfuncs.py. Ich bekomme den Fehler: Keine Handler konnte für Logger gefunden werden "sqlalchemy.engine.base.Engine – morpheous

+0

" Keine Handler konnte für Logger gefunden werden "bedeutet Root Logger hat keine Handler, dh Logger _ist not_ richtig konfiguriert. Wahrscheinlich haben Sie einige konfiguriert Spezifische (nicht root) Logger nur (und so können Sie es verwenden) oder Sie konfiguriert _ _ nach _ es verwendet wird –

Antwort

123

Neben echo Parameter von create_engine() gibt es eine flexiblere Art und Weise: logging Konfiguration Motor Aussagen Echo:

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

Siehe Configuring Logging Abschnitt der Dokumentation für weitere Informationen.

+1

@dennis: das ist, was ich lieber tun würde - in Datei statt OPF-Konsole zu loggen. Ich verwende bereits Protokollierung in der __main__.py meines Pakets (siehe meinen bearbeiteten Code) - nachdem Sie die empfohlenen Änderungen vorgenommen haben, erscheinen die Nachrichten jetzt nicht mehr auf der Konsole (gut), aber sie erscheinen auch nicht in der Protokolldatei (schlecht) Sie klären, wie Sie die Nachrichten in der Datei gelandet bekommen? – morpheous

+1

Gibt es eine Möglichkeit, hübsche Drucken hinzuzufügen? Die Art, wie meine Abfragen standardmäßig ausgegeben werden, ist ein kleines Desaster –

+0

So ist es unmöglich, sich am Ende in eine Datei einzuloggen? Ave suchte tief in die Docs und Stack-Überlauf, aber niemand scheint sich um dieses Problem kümmern, auch wenn die Frage eindeutig von jemandem wie Morpheus oben gestellt wurde. Ist hier etwas offensichtlich? –

53

gefunden werden Sie können die SQL-Anweisungen sehen gesendet zu die DB durch Echo = True zu, wenn der Motor Instanz erstellt wird (in der Regel der create_engine() oder engine_from_config() -Aufruf in Ihrem Code verwendet)

. Zum Beispiel:

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

Standardmäßig werden protokollierte Anweisungen in stdout gespeichert.

Verwandte Themen