我想在我的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'],
}
}
}