【问题标题】:Escape characters in a q-lang query via Python通过 Python 在 q-lang 查询中转义字符
【发布时间】:2020-02-22 10:54:13
【问题描述】:

我在将查询中的转义序列应用于 kdb 服务器时遇到问题。

本机查询是:

select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like "*[BMPQTUWZ]*", corr <= 1

欢迎任何帮助。

我使用 Python 发送它,我在查询中输入了 \" for " 以便传输双引号:

from qpython import qconnection
import pandas as pd
from datetime import datetime

query = 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"*[BMPQTUWZ]*\", corr <= 1'

#query = '\"2+2\"'


print('Attempt to open a connection...')

q = qconnection.QConnection(host=server, port=server_port, username=user, password=server_password, timeout=server_timeout, pandas = True)
q.open()
print('Connection established...')

print('Attempt to send the query', query)
df = pd.DataFrame(q.sendSync(query))
print('Query <<', query, '>> sent...')

'"2+2"' 的输出和 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"[BMPQTUWZ] em>\", corr

PS G:\atom-projects\test> python.exe .\test-1.py
Attempt to open a connection...
Connection established...
Attempt to send the query "2+2"
Traceback (most recent call last):
  File ".\test-1.py", line 23, in <module>
    df = pd.DataFrame(q.sendSync(query))
  File "C:\Python38\lib\site-packages\pandas\core\frame.py", line 509, in __init__
    raise ValueError("DataFrame constructor not properly called!")
ValueError: DataFrame constructor not properly called!


PS G:\atom-projects\test> python.exe .\test-1.py
Attempt to open a connection...
Connection established...
Attempt to send the query select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like "*[BMPQTUWZ]*", corr <= 1
Traceback (most recent call last):
  File ".\test-1.py", line 23, in <module>
    df = pd.DataFrame(q.sendSync(query))
  File "C:\Python38\lib\site-packages\qpython\qconnection.py", line 303, in sendSync
    response = self.receive(data_only = False, **options)
  File "C:\Python38\lib\site-packages\qpython\qconnection.py", line 380, in receive
    result = self._reader.read(**self._options.union_dict(**options))
  File "C:\Python38\lib\site-packages\qpython\qreader.py", line 138, in read
    message = self.read_header(source)
  File "C:\Python38\lib\site-packages\qpython\qreader.py", line 158, in read_header
    header = self._read_bytes(8)
  File "C:\Python38\lib\site-packages\qpython\qreader.py", line 388, in _read_bytes
    data = self._stream.read(length)
  File "C:\Python38\lib\socket.py", line 669, in readinto
    return self._sock.recv_into(b)
socket.timeout: timed out

现在,我遇到了转义字符问题。

如果我将查询发送到 kdb 服务器。

query = 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, corr <= 1'

查询被传输。但是当我添加 not cond like \"[BMPQTUWZ]\" 时,出现错误。

操作系统和 Python 语言详细信息: Windows 10、x64、Python 3.8.1

【问题讨论】:

    标签: python escaping kdb


    【解决方案1】:

    转义对我来说很好:

    q)t:([]sym:100?`1;cond:100#`Buy`Sell`Example;corr:100?2f;price:100?100f)
    q)t
    sym cond    corr      price   
    ------------------------------
    n   Buy     1.339583  82.48839
    m   Sell    1.17743   95.01603
    a   Example 1.135715  54.35053
    o   Buy     0.7889166 29.12758
    b   Sell    1.851226  45.29782
    …
    
    df = q.sendSync('select hi:max price, lo:min price, cond:first cond  by sym from t where not cond like \"[BS]*\"')
    
    df
        hi  lo  cond
    sym             
    b'a'    64.230790   24.164567   b'Example' 
    b'b'    60.669536   12.766243   b'Example'
    b'c'    85.688555   79.785111   b'Example'
    b'd'    83.056125   83.056125   b'Example' 
    b'e'    73.149409   73.149409   b'Example'
    b'f'    93.359214   36.638445   b'Example' 
    ...
    

    '\"2+2\"' 失败,因为返回 4 并且无法在 DataFrame 中呈现。

    由于超时,您的选择似乎失败了。也许尝试增加你的时间。

    您还想通过选择实现什么目标?我的例子不是 cond 以 B 或 S 开头的地方。所以只返回 Example。

    如果 cond 是单个字符列而不是符号,上述 Conor 的建议可能会更快更好。如果它是像我上面的符号列,带有整个单词。必须使用Like/Regex

    【讨论】:

    • 原来是超时时间短。可能是因为查询更复杂。所以你的建议就是解决问题的答案......
    【解决方案2】:

    你试过转义方括号吗?

    query = 'select lo:min price, hi:max price by sym from trade where date = 2007.02.28, not cond like \"\[BMPQTUWZ\]\", corr

    【讨论】:

    • 是的,我试过了,虽然方括号不是转义符号。
    • 我已更新我的答案,但存在格式问题。
    【解决方案3】:

    我想你想运行类似的东西:

    ...在“BMPQTUWZ”中没有条件的地方

    【讨论】:

    • 很可能你是对的,因为查询成功了。我需要再跑几趟,然后我会确认你的答案是最好的。事实是我收到了这个查询(我还没有完成),我认为这是一个很好的查询。
    • 方括号是必须的,否则改变意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多