python - tables - Depuración(visualización) Comando SQL enviado a la base de datos por SQLAlchemy
sqlalchemy relationship not null (2)
Tengo una clase de ORM llamada Person, que se ajusta a una tabla de personas:
Después de configurar la conexión al db, etc., ejecuto la declaración ff.
personas = session.query (Person) .all ()
La tabla de personas no contiene ningún dato (por el momento), así que cuando imprimo las personas variables, obtengo una lista vacía.
Cambié el nombre de la tabla mencionada en mi clase ORM People, a people_foo (que no existe).
Luego ejecuto el script nuevamente. Me sorprendió que no se lanzara ninguna excepción cuando se intentaba acceder a una tabla que no existe.
Por lo tanto, tengo las siguientes 2 preguntas:
- ¿Cómo puedo configurar SQLAlchemy para que vuelva a propagar los errores de db al script?
- ¿Cómo puedo ver (es decir, imprimir) el SQL que se envía al motor de db?
Si ayuda, estoy usando PostgreSQL como el DB
[Editar]
Estoy escribiendo un paquete. En mi script __main__.py
, tengo el siguiente código (abreviado aquí):
### __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]
El módulo común configura el registrador correctamente, y puedo usar el registrador en mis otros módulos que importan comunes.
Sin embargo, en el módulo dbfuncs, recibo el siguiente error / advertencia:
No se encontraron controladores para el registrador "sqlalchemy.engine.base.Engine
Además del parámetro de echo
de create_engine()
hay una manera más flexible: configurar el logging
para hacer eco de las instrucciones del motor:
import logging
logging.basicConfig()
logging.getLogger(''sqlalchemy.engine'').setLevel(logging.INFO)
Consulte la sección Configuración de registro de la documentación para obtener más información.
Puede ver las sentencias de SQL que se envían al DB pasando echo = True cuando se crea la instancia del motor (usualmente usando la llamada create_engine () o engine_from_config () en su código).
Por ejemplo:
engine = sqlalchemy.create_engine(''postgres://foo/bar'', echo=True)
Por defecto, las declaraciones registradas van a stdout.