调试(显示)由SQLAlchemy发送到数据库的SQL命令

mor*_*ous 79 python sqlalchemy

我有一个名为Person的ORM类,它包含一个person表:

在设置与db等的连接之后,我运行ff语句.

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

人员表不包含任何数据(至今),因此当我打印变量人员时,我得到一个空列表.

我将我的ORM类People中引用的表重命名为people_foo(不存在).

然后我再次运行脚本.我很惊讶在尝试访问不存在的表时没有抛出任何异常.

因此,我有以下两个问题:

  1. 我如何设置SQLAlchemy以便将db错误传播回脚本?
  2. 我如何查看(即打印)发送到数据库引擎的SQL

如果它有帮助,我使用PostgreSQL作为数据库

[编辑]

我正在写一个包.在我的people脚本中,我有以下代码(在此缩写):

people = session.query(Person).all()
Run Code Online (Sandbox Code Playgroud)

[EDIT2]

common模块正确设置记录器,我可以在导入common的其他模块中使用logger.

但是在dbfuncs模块中,我收到以下错误/警告:

没有找到记录器"sqlalchemy.engine.base.Engine"的处理程序

Den*_*ach 180

除了echo参数之外create_engine()还有一种更灵活的方式:配置loggingecho echo语句:

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅文档的配置日志记录部分.

  • 有什么办法可以添加漂亮的印刷品吗?我的查询默认输出的方式是一个小灾难。 (3认同)
  • @RomainVincent 通过配置日志记录,可以将记录的信息定向到任何您想要的位置,包括文件。 (3认同)
  • @dennis:这就是我宁愿做的 - 登录到文件而不是 opf 控制台。我已经在我的包的 __main__.py 中使用日志记录(请参阅我编辑的代码) - 进行您建议的更改后,现在消息不再出现在控制台上(很好),但它们也没有出现在日志文件中(坏的)。您能否澄清如何将消息记录到文件中? (2认同)
  • 那么这到底是不是无法登录到文件呢?我已经深入搜索了文档和堆栈溢出,但似乎没有人关心这个问题,即使这个问题是由像上面的 morpheous 这样的人明确提出的。这里有什么明显的东西吗? (2认同)

Men*_*its 70

您可以通过在创建引擎实例时传递echo = True来查看发送到数据库的SQL语句(通常在代码中使用create_engine()或engine_from_config()调用).

例如:

engine = sqlalchemy.create_engine('postgres://foo/bar', echo=True)
Run Code Online (Sandbox Code Playgroud)

默认情况下,记录的语句转到stdout.