如何在MonetDB中调试SQL/Python UDF

如何在MonetDB中调试SQL/Python UDF,python,sql,user-defined-functions,monetdb,Python,Sql,User Defined Functions,Monetdb,在Monetdb的SQL UDF中使用本机Python代码非常强大。但是,调试这样的UDF可以从更多的支持中获益。特别是,如果我使用老式的打印(“调试信息”),它会消失在巨大的黑色空白中 create function dummy() returns string language python{ print('Entering the dummy UDF') return 'hello'; }; 如何从服务器或MonetDB客户端检索此信息。上周我调试了一些Python U

在Monetdb的SQL UDF中使用本机Python代码非常强大。但是,调试这样的UDF可以从更多的支持中获益。特别是,如果我使用老式的打印(“调试信息”),它会消失在巨大的黑色空白中

create function dummy() 
returns string
language python{
    print('Entering the dummy UDF')
    return 'hello';
};

如何从服务器或MonetDB客户端检索此信息。

上周我调试了一些Python UDF:)

步骤1:首先确保您的Python代码至少在Python解释器中工作

步骤2:在Python UDF中,编写调试信息。到文件,例如:

    f = open('/tmp/debug.out', 'w')
    f.write('my debugging info\n')
    f.close()

这并不理想,但很有效。此外,我还使用它导出Python UDF的参数值。通过这种方式,我可以在Python解释器中使用从MonetDB收到的确切数据运行Python UDF的主体。

以防有人对这个问题感兴趣。 调试MonetDB的Python/UDF有两种新方法

1) 使用python客户端pymonetdb()。 你可以安装它抛出pip

pip install numpy
要使用它,请考虑以下设置,其中包含一个整数的表和一个计算给定列的平均绝对偏差的UDF

CREATE TABLE integers(i INTEGER);
INSERT INTO integers VALUES (1), (3), (6), (8), (10);

CREATE OR REPLACE FUNCTION mean_deviation(column INTEGER)
RETURNS DOUBLE LANGUAGE PYTHON {
  mean = 0.0
  for i in range (0, len(column)):
    mean += column[I]
  mean = mean / len(column)
  distance = 0.0
  for i in range (0, len(column)):
    distance += column[i] - mean
  deviation = distance/len(column)
  return deviation;
};
要使用终端调试(即pdb)调试函数,只需使用pymonetdb.connect()打开数据库连接,然后从连接中获取游标对象,并通过游标对象调用debug()函数,将要检查的SQL和要调试的UDF名称作为参数发送

import pymonetdb
conn = pymonetdb.connect(database='demo') #Open Database connection
c = conn.cursor()
sql = 'select mean_deviation(i) from integers;'
c.debug(sql, 'mean_deviation') #Console Debugging
有一个可选的采样步骤,只传输数据的统一随机样本,而不是完整的输入数据集。如果希望采样,只需发送希望从采样中获得的元素数量(例如,如果希望得到10个元素的子集,则发送c.debug(sql,'mean_deviation',10))


2) 使用PyCharm的名为devudf的POC插件,您可以安装该插件并打开PyCharm的插件页面,或者直接转到JetBrains页面:。它在主菜单中添加了一个名为“UDF开发”的选项,允许您直接将UDF从数据库导入和导出到pycharm,并享受IDE的调试功能。

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-好的一点,我已经扩展了答案,所以它并不严重依赖于链接。