【发布时间】:2013-05-16 07:08:39
【问题描述】:
假设我的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()
哪个选项执行速度最快? 有没有更好的方法来做我想做的事?
【问题讨论】:
-
如果你不想利用好的抽象,为什么要使用 Django?除此之外,它是否需要尽可能快?以最易读、最易维护的方式去做,然后,如果你发现你迫切需要性能,优化瓶颈。
-
另外,尝试将
SELECT *的结果转储到字典(在内存中)可能是不可取的。 -
如果您只想选择每条记录,使用
Foo.objects.all()有什么问题?看看 QuerySet API - 大多数用例都可以用它解决。 -
Django 基本上执行“SELECT
list all foo_table cols hereFROM foo_table”,速度一样快。生成 cols 列表可能需要一些操作,但这没什么大不了的。尽管任何 DBA 都会告诉您,它确实可以保护您使用显式表 cols。保护来自显式,因此即使将来表结构因任何原因发生更改,您的代码也会更安全。 -
@sr2222 实际上我使用的是更复杂的请求,例如
SELECT count(*) FROM Question inner join Ask on question_id=question_ask WHERE quiz_ask = %s