如何在 MonetDB 中调试 SQL/Python UDF

     2023-04-13     300

关键词:

【中文标题】如何在 MonetDB 中调试 SQL/Python UDF【英文标题】:How to debug a SQL/Python UDF in MonetDB 【发布时间】:2017-07-06 12:21:20 【问题描述】:

在 Monetdb 的 SQL UDF 中使用本机 Python 代码非常强大。但是,调试此类 UDF 可能会受益于更多支持。特别是,如果我使用老式的 print('debugging info') 它会消失在黑色的大空白中。

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

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

【问题讨论】:

【参考方案1】:

上周我在调试一些 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 解释器中运行我的 Python UDF 的主体,其中包含从 MonetDB 收到的确切数据。

【讨论】:

【参考方案2】:

如果有人仍然对此问题感兴趣。 有两种调试 MonetDB 的 Python/UDF 的新方法。

1) 使用 python 客户端 pymonetdb (https://github.com/gijzelaerr/pymonetdb)。 你可以安装它 throw 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) 使用名为 devudf 的 PyCharm 的 POC 插件,您可以在 pycharm 的插件页面中安装它,或者直接进入 JetBrains 页面:https://plugins.jetbrains.com/plugin/12063-devudf。它在主菜单中添加了一个名为“UDF 开发”的选项,允许您直接将 UDF 从数据库导入和导出到 pycharm,并享受 IDE 的调试功能。

【讨论】:

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

在 MonetDB 中使用 WITH

】在MonetDB中使用WITH【英文标题】:UsingWITHinMonetDB【发布时间】:2021-10-1513:01:13【问题描述】:我正在尝试使用“WITH”在MonetDB中执行下一个查询:withaas(selectdata_stringfromcolombia.dim_tempo)selectt.ano_mes,f.sg_estado,f.cod_produto,sum(f.qtd_vendida... 查看详情

在 MonetDB 中的 case 语句中绑定变量

】在MonetDB中的case语句中绑定变量【英文标题】:BindvariablesincasestatementinMonetDB【发布时间】:2013-07-0816:20:20【问题描述】:在MonetDB中使用绑定变量时,我似乎遇到了一个奇怪的限制。如果我通过说wherefield=$var以正常方式使用绑... 查看详情

使用主键约束在 monetdb 中批量加载

】使用主键约束在monetdb中批量加载【英文标题】:Bulk-loadinginmonetdbwithprimarykeyconstraint【发布时间】:2013-12-2309:03:15【问题描述】:我正在尝试将对象列表批量加载到单列(主键)数据库中。唯一的原因是删除重复项。我无法将... 查看详情

在 MonetDB 中最快实现lead() 或 lag() 窗口函数

】在MonetDB中最快实现lead()或lag()窗口函数【英文标题】:Fastestimplementationoflead()orlag()windowfunctionsinMonetDB【发布时间】:2016-03-2318:29:52【问题描述】:我真的很惊讶MonetDB,基于分析列的DB没有像Lead()或lag()这样的分析函数。我真的... 查看详情

MonetDB 如何使用索引?

】MonetDB如何使用索引?【英文标题】:HowMonetDBusesindexes?【发布时间】:2015-09-0113:31:23【问题描述】:我知道MonetDB是一个自索引数据库,但这实际上是如何工作的?我想了解更多关于它在内部是如何工作的。MonetDB是否也创建复... 查看详情

monetdb 批量复制 |使用 python 批量复制

】monetdb批量复制|使用python批量复制【英文标题】:monetdbbulkcopy|bulkcopywithpython【发布时间】:2015-04-1008:01:34【问题描述】:我面临在monetdb表中批量导入的文件加载问题。下面提供了重新创建问题的详细信息:我已经安装了monetdb... 查看详情

从 MonetdbLite C API 使用 monetdb_append

】从MonetdbLiteCAPI使用monetdb_append【英文标题】:Usingmonetdb_appendfromMonetdbLiteCAPI【发布时间】:2018-09-0814:54:04【问题描述】:我正在尝试在应用程序中使用MonetDBLiteC。根据PDF(https://arxiv.org/pdf/1805.08520.pdf),我将受益于使用monetdb_append... 查看详情

在 Windows 10 x64 上安装 MonetDB ODBC

】在Windows10x64上安装MonetDBODBC【英文标题】:InstallingMonetDBODBConwindows10x64【发布时间】:2018-10-1001:58:33【问题描述】:installationpage没有提到Windows10。是否可以为该操作系统下载MonetDBODBC?如果是这样,我在哪里可以找到这样做的... 查看详情

如何将 unix 时间戳 (INT) 转换为 monetdb 时间戳 ('YYYY-MM-DD HH:MM:SS') 本地时间格式

】如何将unix时间戳(INT)转换为monetdb时间戳(\\\'YYYY-MM-DDHH:MM:SS\\\')本地时间格式【英文标题】:Howtoconvertaunixtimestamp(INT)tomonetdbtimestamp(\'YYYY-MM-DDHH:MM:SS\')localtimeformat如何将unix时间戳(INT)转换为monetdb时间戳(\'YYYY-MM-DDHH:MM:SS\')本地时间... 查看详情

MonetDB 带索引的慢查询

】MonetDB带索引的慢查询【英文标题】:MonetDBSlowQuerywithIndex【发布时间】:2014-03-1521:59:24【问题描述】:我创建了一个10GB(60M记录)的表,在数据插入后手动添加了唯一索引(hidden_​​id)。我有最简单的查询,但需要一分钟才... 查看详情

如何在 XCode 调试器中调试 NSManagedObjects?

】如何在XCode调试器中调试NSManagedObjects?【英文标题】:HowcanIdebugNSManagedObjectsinXCodedebugger?【发布时间】:2010-06-0212:34:06【问题描述】:在XCode调试器中如何获取实体(NSManaged对象的子类)的值?我迷失在NSObject和_cd_XXX结构中。... 查看详情

如何在 Toad 中调试存储过程?

】如何在Toad中调试存储过程?【英文标题】:HowtodebugastoredprocedureinToad?【发布时间】:2012-11-2305:45:15【问题描述】:我安装了Oracle10g,并且有一个包含许多游标和过程的软件包,我该如何调试其中一个过程或游标。你能提供一... 查看详情

如何在 package.json 中禁用“调试”

】如何在package.json中禁用“调试”【英文标题】:Howtodisable“Debug”fromshowinginpackage.json【发布时间】:2020-10-0302:07:56【问题描述】:如何禁止在package.json中scripts部分上方显示的“调试”提示:【问题讨论】:【参考方案1】:设... 查看详情

如何在 Rider 中调试类库项目

】如何在Rider中调试类库项目【英文标题】:HowtodebugclasslibraryprojectsinRider【发布时间】:2017-06-1602:40:25【问题描述】:有一个执行C#库(插件-我的类库)的外部应用程序。是否可以在Rider中将调试附加到我的类库项目。在VisualStud... 查看详情

如何在sharepoint中调试

】如何在sharepoint中调试【英文标题】:howtodebuginsharepoint【发布时间】:2014-05-1309:32:24【问题描述】:我在做外部列表时遇到问题,如果我在共享点查看外部列表,它会显示:"无法显示此Web部件。要解决此问题,请在MicrosoftShareP... 查看详情

在 IntelliJ 中,如何调试 Maven 测试目标?

】在IntelliJ中,如何调试Maven测试目标?【英文标题】:InIntelliJ,howdoidebugamaventestgoal?【发布时间】:2011-04-1615:13:11【问题描述】:使用intellij和mavenpom文件,我如何调试在maven测试目标内运行的测试?当我直接在代码中运行它们时... 查看详情

如何在 Xcode 中调试内部类

】如何在Xcode中调试内部类【英文标题】:HowtodebuginsideclassesinXcode【发布时间】:2014-01-0800:41:01【问题描述】:我正在使用Xcode5.0.2调试一个简单的应用程序。当我尝试检查类的内容时,调试器似乎不知道如何显示该类。例如,我... 查看详情

如何在 nodeJs 中使用 nodemon 调试应用程序

】如何在nodeJs中使用nodemon调试应用程序【英文标题】:HowtodebugapplicationusingnodemoninnodeJs【发布时间】:2016-07-1517:29:30【问题描述】:我们可以使用语法在nodeJs中调试应用程序:node-debugapp.js但是如何使用nodemon进行调试我试过nodemon... 查看详情