Kdb qPython函数查询

Kdb qPython函数查询,kdb,Kdb,我们正在尝试使用qPython构建函数查询。使用简单示例分层,以在运行时构建where条件。 我们在我们的KDB服务器上定义了一个q函数,比如 fn:{[c] t: (select from tbl); :?[t;c;0b;()]; } 在Python中,我们打开一个连接并发送条件 c = [['=', numpy.string_('TradeId'), 123456]] result = conn.sendSync('fn', c) 当我这样做时,在q控制台中,我看到=操作

我们正在尝试使用qPython构建函数查询。使用简单示例分层,以在运行时构建where条件。 我们在我们的KDB服务器上定义了一个q函数,比如

fn:{[c]
    t: (select from tbl);
    :?[t;c;0b;()];
}
在Python中,我们打开一个连接并发送条件

c = [['=', numpy.string_('TradeId'), 123456]]
result = conn.sendSync('fn', c)
当我这样做时,在q控制台中,我看到=操作符为“=”。
问题是如何传递运算符

您可以
kdb端的字符串/字符,将其从字符串/字符转换为底层kdb运算符。这在您的示例中起作用,但您可能需要一些额外的工作/测试来将其推广到所有可能发送的运算符:

q)tbl:([]TradeId:0 123456 123456 123456;col2:1 2 3 4)
q)fn:{[c] c:.[c;(::;0);value];t:(select from tbl); :?[t;c;0b;()];}

q)0(`fn;enlist("=";`TradeId;123456))
TradeId col2
------------
123456  2
123456  3
123456  4

q)0(`fn;(("=";`TradeId;123456);("in";`col2;2 4)))
TradeId col2
------------
123456  2
123456  4
注意-Im使用
0()
在kdb本身内发送请求,但这应该等同于从qPython发送请求。您需要更改的位是
c:[c;(:;0);值]在kdb函数中

@terrylyynch应答有效 对于qPython

从python发送作品

 c = [[ qtype.QLambda( '{x in  y}'), numpy.string_('TradeId'), [123, 456,789]]]

您的解决方案是可行的,但您能否共享运算符数组的通用形式。另外,因为我是新来Q的,你介意解释一下上面这一行是做什么的吗?如果不知道你可能使用的全部过滤器,很难概括。我上面给出的解决方案已经推广到
(“kdb函数/运算符字符串”;columnName;filter)
形式的单个或多个过滤器。至于解释,点
是一个点修正(也称深度修正),
(:;0)
表示数组中所有顶级项的索引零处,最后字符串上的
返回字符串中的kdb对象