【问题标题】:Django 1.7 Data Type Binding OracleDjango 1.7 数据类型绑定 Oracle
【发布时间】:2014-09-25 13:56:49
【问题描述】:

我最近使用 Oracle 后端从 Django1.4 升级到 Django1.7,并注意到以下查询非常慢:

DomainObject.objects.get(some_colume=some_value)

虽然这个打开非常快:

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

我已经在 Oracle 企业管理器中进行了分析,不同之处在于驱动程序将第一个查询的绑定变量作为 NVARCHAR2 传递,而第二个查询的绑定变量作为 VARCHAR2 传递。 由于该列是 VARCHAR2,因此第二个查询可以使用已在该列上定义的索引,而第一个查询则不能。

关于为什么 Django 将第一个查询作为 NVARCHAR2 并将第二个查询作为 VARCHAR2 传递的任何想法?

谢谢, 瓦卡

【问题讨论】:

  • 我还注意到 Django 将看似完全无用的分页信息添加到“获取”查询中。解决方法是运行: from django.db.models import query query.MAX_GET_RESULTS=1
  • 我假设您的意思是“从 Django 1.4 到 Django 1.7”
  • 抱歉,是的,你是对的。

标签: python django oracle type-conversion cx-oracle


【解决方案1】:

所以我设法解决这个问题的唯一方法是对 Django 参数生成器函数进行猴子修补,如下所示:

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 *

可能对同样遇到此问题的其他人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-20
    • 2020-03-01
    • 2016-06-21
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    相关资源
    最近更新 更多