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

前端之家收集整理的这篇文章主要介绍了我可以轻松地重写Django ORM’iexact’以使用LOWER()而不是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的上层字符串扩展也经常使用.

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

原文链接:https://www.f2er.com/python/185689.html

猜你在找的Python相关文章