Django:显示/日志python shell中的ORM sql调用

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

我注意到几个解决scheme,将日志信息添加到HTML页面。 有没有简单的方法转储到命令行呢?

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

query.as_sql() 

打印SQL命令。

即:

 MyModel.objects.all().query.as_sql() 

如果你使用的是Django 1.3:

 import logging l = logging.getLogger('django.db.backends') l.setLevel(logging.DEBUG) l.addHandler(logging.StreamHandler()) 

Rob Hudson的Djangodebugging工具栏 ,以及它的一般awesomne​​ss,还包括一个非常漂亮的debugsqlshell manage.py命令,正是这个。

我试图在生产服务器的shell中使用“ Django:show / log来自python shell的ORM sql调用 ”,但它不工作。 最终有人指出,只有当DEBUG = True时才会执行这个debugging日志logging。 但是你可以这样做:

 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()) 

我在这里离开这个地方,所以我可以在以后find它,并希望它可以节省别人一样的挖掘我做的。

使用django扩展。

 pip install django-extensions ./manage.py shell_plus --print-sql 

对于生产环境,由于debugging设置可能无法正常工作。

 qs = YourModel.objects.all() qs.query.get_compiler('default').as_sql() 

如果你真的想要查看/logging所有的SQL查询,你会想尝试使用Django 1.3(目前是alpha版本,但很快就会生产),它可以为许多组件(包括数据库后端)启用Pythonlogging器 。

当然,如果你使用稳定的Django版本,你可以通过将django/db/models/sql/compiler.py补丁添加到导入列表的底部来获得相同的效果:

 import logging _querylogger = logging.getLogger( 'sql.compiler' ) 

findSQLCompiler::execute_sql()方法并更改:

  cursor = self.connection.cursor() cursor.execute( sql, params ) 

对此:

  cursor = self.connection.cursor() _querylogger.info( "%s <= %s", sql, params ) cursor.execute( sql, params )