J'ai une classe ORM appelée Person, qui s'enroule autour d'une table de personne:
Après avoir configuré la connexion à la base de données, etc., j'exécute l'instruction:
people = session.query(Person).all()
La table person ne contient aucune donnée (pour le moment), donc lorsque j'imprime la variable people
, j'obtiens une liste vide.
J'ai renommé la table référencée dans ma classe ORM People
, to people_foo
(qui n'existe pas).
Je relance ensuite le script. J'ai été surpris qu'aucune exception n'ait été lancée lors de la tentative d'accès à une table qui n'existe pas.
J'ai donc les 2 questions suivantes:
- Comment puis-je configurer SQLAlchemy pour qu'il propage les erreurs de base de données dans le script?
- Comment puis-je afficher (c'est-à-dire imprimer) le SQL qui est envoyé au moteur de base de données?
Si cela aide, j'utilise PostgreSQL.
[Éditer]
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)
[Edit2]
Le module commun configure correctement l'enregistreur et je peux utiliser l'enregistreur dans mes autres modules qui importent du commun.
Cependant, dans le dbfuncs
module, j'obtiens l'erreur / l'avertissement suivant:
Aucun gestionnaire n'a été trouvé pour le journal "sqlalchemy.engine.base.Engine
la source
common.setup_logger()
appel (en supposant qu'il configure correctement la journalisation) ici. De plus, vous n'en avez pas besoinecho=True
lorsque vous utilisez la journalisation.Réponses:
En plus du
echo
paramètre de,create_engine()
il existe un moyen plus flexible: la configurationlogging
des instructions du moteur d'écho:import logging logging.basicConfig() logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
Consultez la section Configuration de la journalisation de la documentation pour plus d'informations.
la source
Vous pouvez voir les instructions SQL envoyées à la base de données en passant
echo=True
lors de la création de l'instance de moteur (généralement en utilisant l' appelcreate_engine()
ouengine_from_config()
dans votre code).Par exemple:
engine = sqlalchemy.create_engine('postgres://foo/bar', echo=True)
Par défaut, les instructions journalisées vont à stdout.
la source