2014-09-25 34 views
0

我最近從Django1.4升級與Oracle後端Django1.7和已經注意到了,下面的查詢極其緩慢:的Django 1.7數據類型綁定甲骨文

DomainObject.objects.get(some_colume=some_value) 
而這對

非常快:

DomainObject.objects.filter(some_colume=some_value)[0] 

我無論是在Oracle企業管理器異形不同的是,對於第一個查詢綁定變量是由駕駛者通過一個NVARCHAR2而第二個被作爲VARCHAR2通過。 由於列是VARCHAR2,所以第二個查詢可以使用列上定義的索引,而第一個查詢不能。

關於爲什麼Django將第一個查詢作爲NVARCHAR2傳遞並將第二個查詢作爲VARCHAR2傳遞的任何想法?

感謝, Vackar

+0

我也注意到Django增加了看起來完全無用的分頁信息到'get'查詢。解決方法是運行: from django.db.models import query query.MAX_GET_RESULTS = 1 – 2014-09-25 14:01:41

+0

我假設你的意思是'從Django 1.4到Django 1.7' – Deepend 2014-09-25 14:17:57

+0

道歉,是的,你是正確的。 – 2014-09-25 14:49:38

回答

0

所以,我已經成功地解決這個問題的唯一辦法,就是猴子修補Django的PARAM發生器的功能如下:

monkey_patch_query.py

from django.db.backends.oracle.base import FormatStylePlaceholderCursor 

def _stringify(val): 
    if isinstance(val, unicode): 
     return str(val) 
    else: 
     return val 

def proper_param_generator(self, params): 
    # Try dict handling; if that fails, treat as sequence 
    if hasattr(params, 'items'): 
     return dict((k, _stringify(v.force_bytes)) for k, v in params.items()) 
    else: 
     return [_stringify(p.force_bytes) for p in params] 

FormatStylePlaceholderCursor._param_generator = proper_param_generator 

Settings.py

from monkey_patch_query import * 

對於也遇到此問題的其他人可能會有用。