Django:显示/记录来自python shell的ORM sql调用

Par*_*and 53 django orm

使用优秀的Django-Devserver我在我的代码中找到各种有趣和意外的SQL调用.我想找到调用的来源,所以我正在寻找一种方法来获取日志或打印出在Python shell中由Django ORM生成的所有SQL调用.也就是说,当我通过Python shell进行Django ORM调用时,我希望看到打印出来或记录的结果SQL.

我注意到几个解决方案将日志信息添加到html页面.是否有一种简单的方法转储到命令行?

jac*_*ian 187

如果你正在使用Django 1.3:

import logging
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
Run Code Online (Sandbox Code Playgroud)

  • 与Django合作四年,从来没有新过这个.真棒! (2认同)
  • 这对Django 1.8仍然有用. (2认同)
  • rails轨道控制台上的ruby默认启用了这种输出,我希望复制它; 优秀! (2认同)
  • 我应该将此代码放在settings.py中吗?菜鸟在这里。请帮忙。 (2认同)

Dan*_*man 31

Rob Hudson的Django调试工具栏,以及它的一般的awesomne​​ss,还包括一个非常漂亮的debugsqlshellmanage.py命令,它正是这样做的.


bab*_*unk 29

我试图在生产服务器上的shell中使用" Django:显示/记录来自python shell的ORM sql调用 ",但它无法正常工作.最终有人指出它只会执行此调试日志记录DEBUG = True.但你可以解决这个问题:

import logging
from django.db import connection
connection.force_debug_cursor = True  # Change to use_debug_cursor in django < 1.8
l = logging.getLogger('django.db.backends')
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
Run Code Online (Sandbox Code Playgroud)

我将它留在这里,以便我可以在以后找到它,并希望它可以节省其他人同样的挖掘工作.


Ven*_*tra 23

使用django扩展.

pip install django-extensions
./manage.py shell_plus --print-sql
Run Code Online (Sandbox Code Playgroud)

对于生产环境,由于调试设置,它可能无法工作.

  • 即使在生产中,也可以作为第一个Python shell_plus命令运行`settings.DEBUG = True`。 (2认同)

Zac*_*ach 11

如果您在shell中或任何地方,可以使用queryset方法

query.as_sql()
Run Code Online (Sandbox Code Playgroud)

打印SQL命令.

即:

MyModel.objects.all().query.as_sql()
Run Code Online (Sandbox Code Playgroud)

  • 使用Django 1.5和`query.as_sql()`对我来说不起作用.但是`query.sql_with_params()`确实如此. (11认同)
  • 你也可以做>>>打印MyModel.objects.all().query (4认同)

coo*_*ean 6

qs = YourModel.objects.all()

qs.query.get_compiler('default').as_sql()
Run Code Online (Sandbox Code Playgroud)


Cra*_*der 5

如果您真的想要查看/记录所有SQL查询,那么您将需要尝试使用Django 1.3(目前处于alpha版本,但很快就会投入生产),它可以为许多组件(包括数据库后端)启用Python记录器.

当然,如果您坚持使用稳定版本的Django,django/db/models/sql/compiler.py通过将其添加到导入列表的底部,可以相对轻松地获得相同的效果:

import logging
_querylogger = logging.getLogger( 'sql.compiler' )
Run Code Online (Sandbox Code Playgroud)

找到SQLCompiler::execute_sql()方法并改变:

    cursor = self.connection.cursor()
    cursor.execute( sql, params )
Run Code Online (Sandbox Code Playgroud)

对此:

    cursor = self.connection.cursor()
    _querylogger.info( "%s <= %s", sql, params )
    cursor.execute( sql, params )
Run Code Online (Sandbox Code Playgroud)