从另一个命名空间访问 kdb 表

时间:2021-07-01 11:36:03

标签: kdb

难以访问来自不同命名空间的表。 我有一个这样的功能:

\d .myns

myfunc:{[]
/\d / shows .myns when run manually (would love to have a ".Q.d" to run it programmatically) 
    if[not `mytable in tables `. ; .Q.l `$"/mypath/hdb" ];
    /if[not `mytable in tables `. ; '".myns.myfunc could not load mytable in `." ];
    `mytable in key `; / worth 0b
    `mytable in tables `.; / worth 1b
    `mytable in tables `.myns; / worth 0b
    meta mytable; / raise exception `mytable as it can't find mytable
    select from `..mytable where date = .z.d -1 / not sure if it's supposed to work but doesn't in any case
    meta `.[`mytable]; / not sure if it's supposed to work but doesn't in any case
    };

但是,如果我转到暂存器并运行 meta mytable,那么它可以毫无问题地运行。
有人能解释一下如何从不同命名空间中的函数访问 hdb 表吗?我无法从在线文档中找出问题...

编辑

好的,我找到了问题所在。

if[not `mytable in tables `. ; .Q.l `$"/mypath/hdb" ];

我的进程并不“干净”,因为我是从 python 查询的。
在 python 中,我在根命名空间中,.Q.l 在根命名空间中加载我的表。 但是当我在分析师中手动运行代码时,我在 .myns 因此,在查询了我的过程后,表 . is now 1b: the .Q.l is not run, and mytable resides in the rootnamespace. Then i run the code manually meta mytable` 中的测试 mytable 实际查询 .myns.mytable
所以我这样修改了代码:

if[not `mytable in tables system "d" ; .Q.l `$"/mypath/hdb" ];

这样,当我从外部查询时它可以工作,当我手动运行时,系统“d”值得 .myns 并且 .Q.l 运行并在 .myns 中加载表。

这应该可行,但这并不理想:表将按命名空间加载一次。有没有办法让 .Q.l 在根命名空间中加载表?我试过玩,但没有成功...... 它也不起作用,当我手动运行代码时出现 par 错误。从 python 查询工作正常。并实际手动运行after 从python 查询修复了par 错误。待续...

2 个答案:

答案 0 :(得分:1)

我从来没有用过 KX Analyst,你不能从根命名空间运行代码吗?是的,您应该将 hdb 加载到根命名空间而不是 .myns。它在 python 之后加载到 .myns 的原因是因为 python 调用将在根中定义一些必要的全局变量,例如 sym 和 date(如果 hdb 是日期分区的)。像这样的东西应该将 hdb 加载到根命名空间中:

loadHdb:{
  ns:string system"d";
  system "d .";
  .Q.l `hdb;
  system "d ",ns};

编辑:当从客户端远程调用时,这实际上不起作用

答案 1 :(得分:0)

这似乎是 .z.d -1 周围的语法错误,此处需要注意空格。当前 .z.d -1 正在尝试索引到 .z.d 中的 -1 但这不是一个列表。对 select 语句的以下更改应允许该函数运行:

select from `..mytable where date = .z.d - 1; 

您也可以在 select 语句中使用 .Q.dd。这是一个用于连接符号的有用函数 - 查看更多信息:https://code.kx.com/q/ref/dotq/#qdd-join-symbols

select from .Q.dd[`.;`t] where date = .z.d - 1;

对于函数的第一行,您可以将 \d 替换为 system"d"。系统允许以编程方式将 [A-Z] 用于您想要发送到操作系统的任何内容。例如

system "ls"
system"p 1234"
相关问题