2017-06-09 42 views
0

这个问题不同log all sql queriesDjango的1.11 - 如何打印SQL语句与取代变量

我试图从答案登录配置上面,他们没有工作,因为我想他们的工作,所以请继续阅读。

我想要做的是让Django(1.11.x)调试服务器以这种方式记录SQL查询,以便我可以将它们重定向到* .sql文件并立即执行。

为此,我需要所有的变量都已经取代一个SQL语句,所以我不希望这样的:

WHERE some_column in (:arg1, :arg2, ...) 

,但我想这个代替:

WHERE some_column in ('actual_value_1', 'actual_value2', ...) 

可以请你帮我弄清楚如何做到这一点?

  1. 请注意,我不希望在浏览器中要打印的SQL查询(在一些调试应用程序像django_debug_toolbar),但打印到控制台。

  2. 请注意,我不希望在控制台输入Django的查询集查询 - 我想在浏览器中键入URL,这样做实际的HTTP请求Django的调试服务器,并把它打印一个SQL查询在这样的我可以稍后使用SQL Plus或任何其他控制台工具执行它。

+0

的[记录所有的SQL查询]可能的复制(HTTPS ://stackoverflow.com/questions/4375784/log-all-sql-queries) –

+0

查看此答案https:// stackoverflow.com。com/a/20161527/548562 –

+0

对不起@IainShelvington,我读了上述两个线程,他们不回答我的问题。 – mnowotka

回答

0

这有点破解,因为我们必须去掉默认的日志消息django.db.backends所花费的时间和参数。做了这些改变后,你应该有纯粹的SQL,你是自由的,你想运行的文件...

首先要设置您的日志记录设置,参考我们的新日志处理程序

设置:

LOGGING = { 
    'version': 1, 
    'handlers': { 
     'sql': { 
      'level': 'DEBUG', 
      'class': 'my_project.loggers.DjangoSQLFileHandler', 
      'filename': '/path/to/sql.log' 
     }, 
    }, 
    'loggers': { 
     'django.db.backends': { 
      'handlers': ['sql'], 
      'level': 'DEBUG' 
     } 
    } 

} 

然后,您需要定义您的新处理程序,并从消息中去除不需要的文本。

my_project.loggers.py

from logging import FileHandler 


class DjangoSQLFileHandler(FileHandler): 

    def getMessage(self): 
     msg = super(DjangoSQLFileHandler, self).getMessage() 
     return record.msg.split(') ', 1)[1].split(';', 1)[0] + ';' 
+0

它并没有真正的工作,我得到一个例外︰https://gist.github.com/mnowotka/9edfbc040c91c91bc04a2f18a074d7ed – mnowotka

+0

我已经更新了我的答案。我的黑客修改信息是在错误的地方 –

+0

我认为你只有在SQL语句中有一处引用params的地方才能工作。 – mnowotka

1

我觉得我只是做了该工具将是您的最佳选择。

https://pypi.python.org/pypi/django-print-sql

https://github.com/rabbit-aaron/django-print-sql

安装这样的:

pip install --upgrade django-print-sql 

使用像这样在您的视图功能:

from django_print_sql import print_sql 

Class MyView(View): 
    def get(self, request): 
     with print_sql(): 
      User.objects.get(id=request.user.id) 
      # and more.... 
+0

注意:如果在多个线程中执行多个查询,则计数可能不准确。 –

+0

看起来不错!我喜欢上下文管理器的想法。你有装饰器吗?当你想获得从函数打印的所有SQL时,它会很方便。 – mnowotka