django如何打印出sql语句?

尝试了很多种都没看到sql语句

代码简化后如下,使用connection.queries是[]

        from django.db import connection
        with transaction.atomic():
            instance_id = payload.get('instance_id', 0)
            stages = payload.get('stages', [])

            install_info = instance.install_info.first()
            if install_info.install_process:
                install_info.install_process_history.add(install_info.install_process)
                install_info.install_process = None
            next_proc, prev_proc = None, None
            for index, stage in enumerate(stages):
                process = DBInstallProcess.objects.create(database=instance, index=index, result=0, info=stage)
                logger.error(str(connection.queries))
                if prev_proc:
                    prev_proc.next = process
                    process.prev = prev_proc
                    prev_proc.save()
            install_info.save()
            instance.save()
        logger.error(str(connection.queries))

settings


LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s]- %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/leopard.log',
            'maxBytes': 1024 * 1024 * 512,  # 512 MB
            'backupCount': 5,
            'formatter': 'verbose',
        },
        'django-q': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': 'logs/qcluster.log',
            'maxBytes': 1024 * 1024 * 512,  # 512 MB
            'backupCount': 5,
            'formatter': 'verbose',
        },
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        }
    },
    'loggers': {
        'default': {  # default日志
            'handlers': ['console', 'default'],
            'level': 'WARNING'
        },
        'django-q': {  # django_q模块相关日志
            'handlers': ['console', 'django-q'],
            'level': 'WARNING',
            'propagate': False
        },
        'django_auth_ldap': {  # django_auth_ldap模块相关日志
            'handlers': ['console', 'default'],
            'level': 'WARNING',
            'propagate': False
        },
        'django.db.backends': {  # 打印SQL语句,方便开发
            'handlers': ['console', 'default'],
            'level': 'DEBUG',
            'propagate': False
        },
        'django.request': {  # 打印请求错误堆栈信息,方便开发
            'handlers': ['console', 'default'],
            'level': 'DEBUG',
            'propagate': False
        },
    }
}

==========================
找到原因了,settings里有个debug,需要设置为True

阅读 794
avatarAI BotBETA

在 Django 中,你可以通过设置日志记录器的级别为 'DEBUG' 来打印 SQL 语句。在你的设置中,你已经将 'django.db.backends' 的级别设置为 'DEBUG',这意味着它会记录所有数据库查询。

然而,如果你看不到 SQL 语句,可能是因为你没有正确地设置或使用 django.db.backends 日志处理器。以下是如何正确地设置和使用它:

  1. 在你的 settings.py 中,确保已经设置了 LOGGING 配置,并且 django.db.backends 的级别被设置为 'DEBUG'。你已经这样做了。
  2. 你需要导入 django.core.management.color 模块并使用 no_style 函数创建一个日志格式化器,该格式化器将打印 SQL 语句。
  3. 在你的代码中,使用 django.db.backends 日志处理器来记录查询。你已经尝试过这样做,但你的代码片段不完整,所以我会给你一个完整的示例:
from django.core.management.color import no_style
from django.db import connection
from django.utils import timezone
from logging import getLogger

logger = getLogger('django.db.backends')

def print_sql(self, sql, params=None, many=None, context=None):
    if self.sql_log_level == 'DEBUG':
        self.make_debug(sql, params, many, context)

connection.print_sql = print_sql

这段代码首先导入了必要的模块,然后创建了一个新的 print_sql 函数,该函数会在 SQL 语句执行时被调用。如果 sql_log_level 等于 'DEBUG',则会调用 make_debug 函数来记录 SQL 语句。make_debug 函数会将 SQL 语句和参数记录到日志中。最后,我们将 print_sql 函数赋值给 connection.print_sql,这样它就可以被 Django 的数据库连接器使用。现在,每次执行 SQL 语句时,它都会被记录到日志中。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题