Ich habe eine ORM-Klasse namens Person, die sich um eine Personentabelle wickelt:
Nachdem ich die Verbindung zur Datenbank usw. hergestellt habe, führe ich die folgende Anweisung aus:
people = session.query(Person).all()
Die Personentabelle enthält (noch) keine Daten. Wenn ich also die Variable drucke people
, erhalte ich eine leere Liste.
Ich benannte die Tabelle nach meiner ORM - Klasse People
, zu people_foo
(die nicht existiert).
Ich führe dann das Skript erneut aus. Ich war überrascht, dass beim Versuch, auf eine nicht vorhandene Tabelle zuzugreifen, keine Ausnahme ausgelöst wurde.
Ich habe daher folgende 2 Fragen:
- Wie kann ich SQLAlchemy so einrichten, dass Datenbankfehler an das Skript zurückgegeben werden?
- Wie kann ich die SQL anzeigen (dh drucken), die an die DB-Engine gesendet wird?
Wenn es hilft, verwende ich PostgreSQL.
[Bearbeiten]
Ich schreibe ein Paket. In meinem __main__.py
Skript habe ich den folgenden Code (hier abgekü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:pwd@localhost:port/dbname', echo=True)
[Edit2]
Das Common-Modul richtet den Logger korrekt ein, und ich kann den Logger in meinen anderen Modulen verwenden, die Common importieren.
Im dbfuncs
Modul wird jedoch der folgende Fehler / die folgende Warnung angezeigt:
Für den Logger "sqlalchemy.engine.base.Engine" wurden keine Handler gefunden
quelle
common.setup_logger()
Aufruf (vorausgesetzt, die Protokollierung wird ordnungsgemäß konfiguriert). Außerdem benötigen Sie keineecho=True
Protokollierung.Antworten:
Zusätzlich zu den
echo
Parametern voncreate_engine()
gibt es eine flexiblere Möglichkeit: Konfigurierenlogging
, um Engine-Anweisungen wiederzugeben:Siehe Konfigurieren der Protokollierung Abschnitt der Dokumentation für weitere Informationen.
quelle
Sie können sehen, dass die SQL-Anweisungen an die Datenbank gesendet werden, indem Sie sie übergeben,
echo=True
wenn die Engine-Instanz erstellt wird (normalerweise mithilfe des Aufrufscreate_engine()
oderengine_from_config()
in Ihrem Code).Beispielsweise:
Standardmäßig werden protokollierte Anweisungen an stdout gesendet.
quelle