q Python Функциональные запросы - PullRequest
0 голосов
/ 02 апреля 2020

Мы пытаемся построить функциональные запросы, используя q Python. Рассказ с простыми примерами, чтобы построить, где условия во время выполнения. мы определили функцию aq на нашем сервере KDB как

fn:{[c]
    t: (select from tbl);
    :?[t;c;0b;()];
}

в Python, когда мы открываем соединение и отправляем условие

c = [['=', numpy.string_('TradeId'), 123456]]
result = conn.sendSync('fn', c)

, когда я делаю это, в консоли q я вижу, что = оператор как "=". вопрос как пройти операторы

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

@ terrylynch ответ работает специально для q Python

из python отправка работает

 c = [[ qtype.QLambda( '{x in  y}'), numpy.string_('TradeId'), [123, 456,789]]]
0 голосов
/ 02 апреля 2020

Вы можете value строка / символ на стороне 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

Примечание. Я использую 0() для отправки запросов внутри самого kdb, но это должен быть эквивалентом отправки от q Python. Бит, который вам нужно изменить, это c:.[c;(::;0);value]; в вашей функции kdb

...