【问题标题】:Can I easily over-ride Django ORM 'iexact' to use LOWER() instead of UPPER()?我可以轻松地覆盖 Django ORM 'iexact' 以使用 LOWER() 而不是 UPPER() 吗?
【发布时间】:2012-02-19 22:59:06
【问题描述】:

使用 Django 1.3x。

我目前有一个非常非常大且非常活跃的 Postgres 数据集,其中有一个重要的列索引为 lower(column)

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

有没有一种简单的方法可以强制 ORM 使用 lower(),或者我需要为此使用原始 SQL 吗?

谢谢!

[对 cme​​ts 的附加问题:是否有充分的理由(被忽视)在索引上使用 upper(),而不是 lower()?]

【问题讨论】:

    标签: django postgresql django-orm


    【解决方案1】:

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

    我查看了后端代码,唯一能发现UPPERLOWER 的任何原因似乎是Oracle 在处理不区分大小写的数据时默认为大写。由于其他人是不可知论者,看来 Django 决定默认为UPPER 以涵盖所有基础。

    查看源代码给我的另一个印象是你不会使用UPPER。它实际上无处不在,而不仅仅是在实际查询数据库时。 Python 的 upper 字符串扩展名也经常使用。

    我会说你最好的选择是简单地使用upper(column) 或代替创建一个索引,然后去喝一杯。

    【讨论】:

    • 克里斯,感谢您的回答!我也遇到了这些票,但没有看到任何关于为什么突然更改为upper() 的重大讨论。您对 Oracle 位的见解是我听过的最多的。这是一个简单的查询,真的,所以我想我会在这里使用.raw()。非常感谢!
    【解决方案2】:

    在去.raw()之前尝试.extra()

    MyModel.objects.extra(where=["lower(mycol)=%s"], params=['foo'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 2010-10-27
      • 2012-02-25
      • 2011-02-09
      • 2015-11-15
      • 1970-01-01
      • 2014-12-20
      • 2022-07-07
      相关资源
      最近更新 更多