如何从clickhouse orm中合并多个查询集

cedebl8k  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(648)

在django搜索应用程序中,我想查询clickhouse数据库(使用infi.clickhouse\ orm库)中的成对值,例如(a=1和b>=1.5)或(a=2和b>=1)。在sql中,这可以通过

select * from table where a == 1 and b >= 1.5 UNION ALL select * from table where a == 2 and b >= 1

看看我尝试过的其他例子:
查询集定义为

qs = TABLE.objects_in(db)
qs_1 = qs.filter(A__eq=1, B__gte=1.5)
qs_2 = qs.filter(A__eq=2, B__gte=1)

操作员

qs_union = qs_1 | qs_2

它回来了

unsupported operand type(s) for |: 'QuerySet' and 'QuerySet'

联合运营者

qs_union = qs_1.union(qs_2)

它回来了

'QuerySet' object has no attribute 'union'

以及q对象

qs_union = qs.filter(Q(A__eq=1, B__gte=1.5) | Q(A__eq=2, B__gte=1))

它回来了

'Q' object has no attribute 'to_sql'

在clickhouse模型中,如何执行2个或更多查询集的并集?
谢谢!

gopyfrb3

gopyfrb31#

简而言之:你应该使用 Q 等级 infi.clickhouse_orm.query ,例如:

from infi.clickhouse_orm.query import Q

这个 Q -上课时间 info.clickhouse_orm [github]有一个 to_sql 方法:

class Q(object):

    # ...

    def to_sql(self, model_cls):
        if self._fovs:
            sql = ' {} '.format(self._mode).join(fov.to_sql(model_cls) for fov in self._fovs)
        else:
            if self._l_child and self._r_child:
                sql = '({} {} {})'.format(
                        self._l_child.to_sql(model_cls), self._mode, self._r_child.to_sql(model_cls))
            else:
                return '1'
        if self._negate:
            sql = 'NOT (%s)' % sql
        return sql

因为错误说明找不到 to_sql ,看起来你没用 Q -同学们,但django Q 班级。

相关问题