【发布时间】:2011-02-19 21:38:26
【问题描述】:
我想从大型数据库中检索与给定过滤器查询匹配的前 500 个结果。
目前我正在使用以下(非常低效)的方法..
results = Entries.objects.filter(text__icontains="somequery")[0:500]
但我认为这个查询会将整个数据库加载到内存中,然后截断结果。太慢了。
有没有更优雅的方法来做到这一点?谢谢!
【问题讨论】:
我想从大型数据库中检索与给定过滤器查询匹配的前 500 个结果。
目前我正在使用以下(非常低效)的方法..
results = Entries.objects.filter(text__icontains="somequery")[0:500]
但我认为这个查询会将整个数据库加载到内存中,然后截断结果。太慢了。
有没有更优雅的方法来做到这一点?谢谢!
【问题讨论】:
这就是这样做的方法。
生成的 SQL 使用 LIMIT,因此它不会将整个数据库加载到内存中并被 python 切片。
请注意,您可以使用django.db.connection.queries 查看 SQL django 正在编写的内容
http://docs.djangoproject.com/en/dev/faq/models/#how-can-i-see-the-raw-sql-queries-django-is-running
但一个鲜为人知的技巧是打印queryset.query 或致电sql = queryset.query.__str__()
>>> results = Entries.objects.filter(text__icontains="somequery")[0:500]
>>> print results.query
SELECT ... FROM ... WHERE ... LIKE ... LIMIT 500
【讨论】:
QuerySet 复制了这种行为。例如,[][0:1000] 不会引发错误。