【问题标题】:KDB - getting error when I wrap working code in a functionKDB - 当我将工作代码包装在函数中时出现错误
【发布时间】:2018-12-14 16:50:27
【问题描述】:

我编写了以下从 sql 表中获取数据的函数。

get_sql_table:{[usr;psswd;server;db;tbl]
    usr: "'", usr, "'";
    psswd: "'", psswd, "'";
    new_tbl: "'", tbl, "'\"";
    map:(`date`datetime`bigint`char`decimal`double`int`varchar)!("DZJCFFIS");
    schema:exec column_name!native from (update native:map[data_type] from (2#"S";enlist"\t") 0: 
        schema:system "mysql --user=",usr," --password=",psswd," -h ",server, " ", db, " --execute=\"select column_name, data_type from information_schema.columns WHERE table_name = ", new_tbl) 
        where not null native;
    query: system "mysql --user=",usr," --password=",psswd," -h ",server, " ", db, " --execute=\"select * from ", tbl, ";\"";
    data:(count["\t" vs query 0]#"S";enlist"\t") 0: query;
    :![data;();0b;k!{($;schema[x];(string;x))} each k:key[schema] inter cols data];
 };

当我加载脚本并尝试运行函数时,有时会在最后一行(return 语句)出现类型错误。最后一行用于将适当的数据类型映射到 kdb 表。

但是,代码有时会成功。似乎它成功和失败的表是任意的,与列类型无关(实际上它在之前成功的表上失败了,反之亦然)。

此外,代码本身没有任何问题。当我在函数之外编写它时,它每次都可以工作,但表的数据类型不在 map 中(但在这种情况下,我可以将其添加到 map)。 此代码仅在包含在函数中时才会失败。

我错过了什么?

【问题讨论】:

  • 我认为当您从 mysql 读取数据时,有时它返回的类型可能与您用于投射的类型不兼容。也许 kdb 在某些情况下试图根据结果解释类型。我建议您插入 show 语句来打印模式的元数据。这将帮助您调试问题。

标签: kdb


【解决方案1】:

您的 schema 变量是在函数中定义的,而不是全局定义的,因此无法在此 lambda 中访问它

{($;schema[x];(string;x))}

你必须像这样传递它

{($;y[x];(string;x))}[;schema] each k:key[schema] inter cols data

它可能在函数之外起作用,因为你不小心全局定义了schema

【讨论】:

  • 很有意义。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2019-12-09
  • 2023-04-08
相关资源
最近更新 更多