Django 1.11 - 如何使用替换变量打印SQL语句

时间:2017-06-09 13:56:05

标签: sql django debugging logging

此问题log all sql queries 不同

我尝试从上面的答案中记录配置它们不能正常工作,所以请继续阅读。

我想做的是让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 QuerySet查询 - 我想在浏览器中输入URL,因此向Django调试服务器发出实际的HTTP请求并看到它打印SQL查询以这种方式,我可以稍后使用SQL Plus或任何其他控制台工具执行它。

2 个答案:

答案 0 :(得分:1)

我认为我刚制作的工具对你来说非常适合。

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

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

像这样安装:

pub struct Message {
    term: Term,
    kind: MessageKind,
}

pub enum MessageKind {
    AppendRequest,
    AppendResponse,
    VoteRequest,
    VoteResponse,
}

在视图功能中使用如下:

pip install --upgrade django-print-sql

答案 1 :(得分:0)

这有点像黑客,因为我们必须删除所用时间和args的默认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] + ';'