Django CaptureQueryContext 无法在 captures_queries 中看到我的对象过滤器查询



我想在我的Django测试用例中记录原始SQL语句。
我可以看到INSERT sql语句,但是在日志中看不到SELECT sql语句。

我想看到日志中的每条SQL语句,无论是CREATE, SELECT, UPDATE还是其他的。

$ python manage.py test
<OUTPUT OMITTED>
Found 1 test(s).
Running tests...
----------------------------------------------------------------------
[{'sql': 'INSERT INTO "myapp_testtabletwo" ("test_field") VALUES ('abc') RETURNING "myapp_testtabletwo"."id"', 'time': '0.001'}]
.
----------------------------------------------------------------------
Ran 1 test in 0.113s
OK
Destroying test database for alias 'default'...
Closing active connection

tests.py

from django.db import connection
from my_app.models import TestTableTwo
class DatabaseExampleTests(TestCase):
databases = '__all__'
def test_example(self):
with CaptureQueriesContext(connection) as ctx:
created_object = TestTableTwo.objects.create(test_field="abc")
all_objects = TestTableTwo.objects.all()
print(ctx.captured_queries)

models.py

from django.db import models
class TestTableTwo(models.Model):
id = models.AutoField(primary_key=True)
test_field = models.CharField(max_length=100, blank=True, null=True)

settings.py

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': "testpostgres",
'USER': "postgres,
'PASSWORD': "password",
'HOST': "postgres"
}
}

$ python -V
Python 3.9.15
$ pip list 
# output omitted
Package                Version
---------------------- ---------
Django                 4.1
psycopg2               2.9.5

编辑:
当我将all_objects = TestTableTwo.objects.all()更改为print(TestTableTwo.objects.all())时,我在日志中看到SELECT sql语句。
但我不明白原因,为什么它与print()语句一起工作。

这里把这个放在settings.py:您可以在终端查看select查询。

import os
LOGGING = {
'version': 1,
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
}
},
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
}
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console'],
}
}
}

相关内容

  • 没有找到相关文章

最新更新