为何Django访问非默认库QuerySet对象属性不触发数据库查询?
问题分析与解决
你遇到的问题核心在于:connection.queries仅追踪默认数据库的查询记录,非默认数据库的查询不会被它统计。
为什么会这样?
Django的django.db.connection对象是默认数据库连接的实例,它的queries列表只记录默认数据库执行的SQL语句。当你用using('db')指定非默认数据库时,查询会走该数据库的独立连接,这些查询不会出现在connection.queries里,所以你打印长度一直是0,但实际上数据库查询已经执行了——不然你根本拿不到obj.id和obj.is_test的值。
而执行print(obj)时,并不是触发了默认数据库查询,只是你依然没正确统计非默认数据库的查询记录而已。
正确的查询统计方式
要查看非默认数据库的查询记录,需要使用对应数据库的连接实例:
from django.db import connections, reset_queries # 重置指定数据库的查询记录 reset_queries(using='db') tests = Test.objects.using('db').filter(is_test=True) print(len(connections['db'].queries)) # 返回0,未执行查询 for obj in tests: print(obj.id) print(obj.is_test) print(len(connections['db'].queries)) # 现在会返回对应的查询次数,证明查询已执行
补充说明
- QuerySet的惰性特性在非默认数据库下依然生效,迭代时肯定会执行数据库查询,只是你之前用错了统计工具。
reset_queries()如果不传using参数,只会重置默认数据库的查询记录;要重置非默认数据库的,必须指定using参数。
内容的提问来源于stack exchange,提问作者Karen
相关产品推荐
相关产品推荐

