原始查询和自定义SQL查询最快的是什么?

时间:2013-05-21 13:29:39

标签: python sql django

假设我的应用程序(webapp)中的文件 models.py 如下所示:

from django.db import models
from django.db import connection

class Foo(models.Model):
    name = models.CharField(...)
    surname = models.CharField(...)

def dictfetchall(cursor):
    "Returns all rows from a cursor as a dict"
    desc = cursor.description
    return [
        dict(zip([col[0] for col in desc], row))
        for row in cursor.fetchall()
    ]

def get_foo():
    cursor = connection.cursor()
    cursor.execute('SELECT * FROM foo_table')
    rows = dictfetchall(cursor)
    return rows

要访问我的数据库内容,我基本上有两个选项:

选项1:

from webapp.models import Foo
bar = Foo.objects.raw('SELECT * FROM foo_table')

选项2:

from application.models import get_foo
bar = get_foo()

哪个选项执行速度最快? 有没有更好的方法来做我想做的事情?

2 个答案:

答案 0 :(得分:0)

关于哪种方法更好,没有直接而明确的答案。

使用Manager.raw()仍会使您保持在ORM层内,当它返回Model实例时,您仍然拥有一个很好的数据库抽象。但是,在进行原始查询时,为了将结果转换为模型实例(请参阅RawQuerySetRawQuery类中发生的事情),django不仅仅需要cursor.execute

但是(引自docs):

  

有时甚至Manager.raw()还不够:您可能需要   执行不完全映射到模型或直接执行的查询   更新,插入或删除查询。

所以,一般来说,选择什么取决于将会得到什么结果以及你将如何处理它们。

另见:

答案 1 :(得分:0)

使用连接游标肯定比使用raw()更快,因为它没有实例化附加对象......但是为了真正告诉你最快的解决方案是什么,你应该做一些基准测试!

如果没有必要,不要过度优化,因为只要你没有任何严重的性能问题,你就会以这种方式避免使用Django的一些最有用的功能。如果你有一些,他们很可能不会是你执行查询的结果。当然,如果你确切地知道你的用例并且ORM没有,那么你将能够编写更好的查询。