3

假设我的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()

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

4

2 回答 2

1

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

UsingManager.raw()仍然让你保持在ORM层内,虽然它返回 Model 实例,但你仍然有一个很好的数据库抽象。但是,在进行原始查询时,django 不仅仅是cursor.execute为了将结果转换为模型实例(查看RawQuerySetRawQuery类中发生了什么)。

但是(来自docs的引用):

有时甚至 Manager.raw() 还不够:您可能需要执行不完全映射到模型的查询,或者直接执行 UPDATE、INSERT 或 DELETE 查询。

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

也可以看看:

于 2013-05-21T14:16:21.090 回答
0

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

如果没有必要,不要过度优化,因为只要你没有任何严重的性能问题,你就会避免使用这种方式来避免 Django 的一些最有用的特性。如果你有一些,它们很可能不是你执行查询的结果。当然,如果您完全了解您的用例而 ORM 不了解,您将能够编写更好的查询。

于 2013-05-21T14:17:58.513 回答