加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

我可以轻松地重写Django ORM’iexact’以使用LOWER()而不是UPPER

发布时间:2020-12-16 23:37:34 所属栏目:Python 来源:网络整理
导读:使用Django 1.3x. 我目前有一个非常非常非常非常活跃的Postgres数据集,其中一个重要的列索引为较低(列). 我刚刚意识到一些常见的查询非常慢,因为当我使用iexact来匹配该字段时,Django ORM正在为字段生成查询,因为blah = UPPER(列). 是否有一种简单的方法可以
使用Django 1.3x.

我目前有一个非常非常非常非常活跃的Postgres数据集,其中一个重要的列索引为较低(列).

我刚刚意识到一些常见的查询非常慢,因为当我使用iexact来匹配该字段时,Django ORM正在为字段生成查询,因为blah = UPPER(列).

是否有一种简单的方法可以强制ORM使用lower()代替,或者我是否需要为这一个删除原始SQL?

谢谢!

[评论的侧面问题:是否有一个很好的理由,被忽略了,在索引上使用了upper()而不是lower()?]

解决方法

有趣的情况在这里.我以前从来没有真正停下来想过这件事.似乎使用UPPER进行iexact搜索是在 revision 8536年引入的,以回应近三年前的 ticket 3575.在此之前,Django一直在使用ILIKE进行这些类型的搜索.

我查看了后端代码,我发现唯一能指出UPPER vs LOWER的任何原因似乎是Oracle在处理不区分大小写的数据时默认为大写.由于其他人是不可知的,似乎Django决定默认使用UPPER来覆盖所有基础.

我从查看源代码得到的另一个印象是你不会使用UPPER.它实际上遍布整个地方,而不仅仅是在实际查询数据库时. Python的上层字符串扩展也经常使用.

我要说的最好的办法就是简单地创建一个带有上部(列)的索引,或者代替,然后去喝一杯.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读