3

私のアプリケーション(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

データベースのコンテンツにアクセスするには、基本的に次の 2 つのオプションがあります。

オプション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

どちらのアプローチが優れているかについて、直接的かつ明確な答えはありません。

Manager.raw()still を使用するORMと、レイヤー内に留まり、 Model インスタンスが返される間、優れたデータベース抽象化が維持されます。しかし、生のクエリを作成している間、django はcursor.execute結果を Model インスタンスに変換するだけではありません ( RawQuerySetおよびRawQueryクラスで何が起こっているかを参照してください)。

しかし(docsからの引用):

Manager.raw() だけでは不十分な場合もあります。モデルにきれいにマップされないクエリを実行したり、UPDATE、INSERT、または DELETE クエリを直接実行したりする必要がある場合があります。

したがって、一般的に言えば、何を選択するかは、得られる結果とその結果をどうするかによって異なります。

以下も参照してください。

于 2013-05-21T14:16:21.090 に答える
0

接続カーソルを使用すると、追加オブジェクトがインスタンス化されないため、接続カーソルを使用するよりも確実に高速raw()です...しかし、最速のソリューションが何であるかを実際に知るには、ベンチマークを行う必要があります!

また、パフォーマンスに重大な問題がない限り、最適化を過度に行う必要はありません。また、いくつかある場合、クエリの実行方法の結果ではない可能性が最も高くなります。もちろん、ユースケースを正確に知っていて、ORM が知らない場合は、より良いクエリを作成できます。

于 2013-05-21T14:17:58.513 に答える