假设我的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
要访问我的数据库内容,我基本上有两个选项:
from webapp.models import Foo
bar = Foo.objects.raw('SELECT * FROM foo_table')
from application.models import get_foo
bar = get_foo()
哪个选项执行速度最快? 有没有更好的方法来做我想做的事情?
答案 0 :(得分:0)
关于哪种方法更好,没有直接而明确的答案。
使用Manager.raw()
仍会使您保持在ORM
层内,当它返回Model实例时,您仍然拥有一个很好的数据库抽象。但是,在进行原始查询时,为了将结果转换为模型实例(请参阅RawQuerySet和RawQuery类中发生的事情),django不仅仅需要cursor.execute
。
但是(引自docs):
有时甚至Manager.raw()还不够:您可能需要 执行不完全映射到模型或直接执行的查询 更新,插入或删除查询。
所以,一般来说,选择什么取决于将会得到什么结果以及你将如何处理它们。
另见:
答案 1 :(得分:0)
使用连接游标肯定比使用raw()
更快,因为它没有实例化附加对象......但是为了真正告诉你最快的解决方案是什么,你应该做一些基准测试!
如果没有必要,不要过度优化,因为只要你没有任何严重的性能问题,你就会以这种方式避免使用Django的一些最有用的功能。如果你有一些,他们很可能不会是你执行查询的结果。当然,如果你确切地知道你的用例并且ORM没有,那么你将能够编写更好的查询。