【问题标题】:Django QuerySet changing IN to ANY(array[...])Django QuerySet 将 IN 更改为 ANY(array[...])
【发布时间】:2014-07-25 12:23:42
【问题描述】:

我们的数据库中有一些运行缓慢的查询,我认为其中一些可以通过更改底层 SQL 来解决。

鉴于以下情况:

Model.objects.filter(rel_id__in=[1,2,3])

输出(删节):

SELECT all, the, fields FROM "model" WHERE ("rel_id" IN (1, 2, 2))

我想要的是将 SQL 更改为:

SELECT all, the, fields FROM "model" WHERE ("rel_id" = ANY(array[1, 2, 2])) 

我知道这可能不是最佳方法,但EXPLAIN ANALYSE 在第二个查询中返回的数字要低得多。

所以我的问题是,如何从 QuerySet 查找中获取第二个 SQL 查询?

提前致谢

【问题讨论】:

  • 这很奇怪。请显示两个查询计划。通常这两个是等价的——IN 在规划 IIRC 的早期就变成了= ANY

标签: django postgresql-9.1


【解决方案1】:

可能是这样的:

Model.objects.extra(
    where=['"rel_id" = ANY(array%s)' % (str(your_list))]
)

否则你可能不得不使用raw

【讨论】:

  • 最好提一下your_list应该是一个字符串序列来使用str.join
  • 对此有一个警告,即 your_list 是 django 截断的查询集或值列表。应该改为:'"feed_id" = ANY(array[%s])' % ','.join([str(ident] for ident in your_list)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2012-09-02
相关资源
最近更新 更多