当前位置: 首页 > news >正文

DeepSeek总结的DuckDB动态函数应用插件

来源:https://github.com/teaguesterling/duckdb_func_apply

DuckDB FuncApply 扩展

DuckDB 的动态函数应用 - 在运行时通过名称调用函数。

概述

FuncApply 扩展为 DuckDB 提供了动态函数调用能力,允许您:

  • 使用apply()通过名称调用任何标量函数或宏
  • 使用apply_with()动态传递参数
  • 使用apply_table()apply_table_with()动态调用表函数
  • 使用function_exists()检查函数是否存在

这对于数据驱动的转换、动态 SQL 生成以及构建灵活的数据管道非常有用。

快速开始

-- 加载扩展LOADfunc_apply;-- 动态调用标量函数SELECTapply('upper','hello world');-- 结果: HELLO WORLDSELECTapply('substr','hello world',7,5);-- 结果: world-- 动态调用表函数SELECT*FROMapply_table('range',5);-- 返回: 0, 1, 2, 3, 4SELECT*FROMapply_table('generate_series',1,10,2);-- 返回: 1, 3, 5, 7, 9-- 在调用前检查函数是否存在SELECTfunction_exists('my_custom_func');-- 结果: true/false

函数

apply(func_name, ...args)

使用提供的参数通过名称调用一个函数。

-- 字符串函数SELECTapply('upper','hello');-- HELLOSELECTapply('concat','a','b','c');-- abcSELECTapply('substr','hello',2,3);-- ell-- 数值函数SELECTapply('abs',-42);-- 42SELECTapply('round',3.14159,2);-- 3.14-- 列表函数(宏)SELECTapply('list_sum',[1,2,3,4]);-- 10SELECTapply('list_reverse',[1,2,3]);-- [3, 2, 1]-- 支持命名参数SELECTapply('substr','hello world',start:=7,length :=5);-- world

apply_with(func_name, args, kwargs)

使用作为列表提供的参数调用一个函数。

-- 基本用法SELECTapply_with('upper',args :=['hello']);-- 结果: HELLO-- 使用位置语法SELECTapply_with('concat',['a','b','c'],NULL);-- 结果: abc

注意:DuckDB 列表必须是同质的(相同类型)。对于混合类型的参数,请直接使用apply()

apply_table(func_name, ...args)

通过名称调用一个表函数,并将其结果作为表返回。

-- 基本范围SELECT*FROMapply_table('range',5);-- 返回: 0, 1, 2, 3, 4-- 带步长的生成序列SELECT*FROMapply_table('generate_series',1,10,2);-- 返回: 1, 3, 5, 7, 9-- 在连接中使用SELECTd.*,r.rangeasidxFROMmy_data dCROSSJOINapply_table('range',3)r;-- 在子查询中使用SELECT*FROMmy_tableWHEREidIN(SELECTrangeFROMapply_table('range',100));

apply_table_with(func_name, args, kwargs)

使用作为列表提供的参数和可选的命名参数调用一个表函数。

-- 基本用法SELECT*FROMapply_table_with('range',args :=[5]);-- 返回: 0, 1, 2, 3, 4-- 使用命名参数SELECT*FROMapply_table_with('generate_series',args :=[1],kwargs :={stop:10,step:2});-- 返回: 1, 3, 5, 7, 9

function_exists(name)

如果存在具有给定名称的函数,则返回 true。

SELECTfunction_exists('upper');-- trueSELECTfunction_exists('nonexistent');-- false-- 用于条件逻辑SELECTCASEWHENfunction_exists(func_name)THENapply(func_name,value)ELSE'N/A'ENDFROMmy_table;

支持的函数类型

类型是否支持使用的函数示例
标量函数apply,apply_withupper,abs,substr
apply,apply_withlist_sum,list_reverse
表函数apply_table,apply_table_withrange,generate_series
聚合函数不适用sum,avg

用例

数据驱动的转换

-- 在表中存储转换规则CREATETABLEtransforms(column_nameVARCHAR,func_nameVARCHAR);INSERTINTOtransformsVALUES('name','upper'),('email','lower'),('phone','trim');-- 动态应用转换SELECTapply(t.func_name,d.value)asresultFROMdatadJOINtransforms tONd.column=t.column_name;

动态函数选择

-- 根据数据类型选择函数SELECTapply(CASEtypeof(value)WHEN'VARCHAR'THEN'upper'WHEN'INTEGER'THEN'abs'ELSE'to_string'END,value)FROMmy_table;

执行前验证

-- 仅调用存在的函数SELECTfunc_name,CASEWHENfunction_exists(func_name)THENapply(func_name,'test')ELSE'Function not found'ENDasresultFROMfunction_list;

动态表生成

-- 根据配置生成动态行数SELECT*FROMapply_table('range',row_count)WHERErow_count=(SELECTmax_rowsFROMconfig);-- 在交叉连接中使用表函数进行数据扩展SELECTd.*,idx.rangeaspositionFROMmy_data dCROSSJOINapply_table('range',d.repeat_count)idx;

构建

先决条件

DuckDB 扩展使用 VCPKG 进行依赖管理:

gitclone https://github.com/Microsoft/vcpkg.git ./vcpkg/bootstrap-vcpkg.shexportVCPKG_TOOLCHAIN_PATH=`pwd`/vcpkg/scripts/buildsystems/vcpkg.cmake

构建

make

测试

maketest

安装

从源码构建

构建后,扩展位于:

./build/release/extension/func_apply/func_apply.duckdb_extension

在 DuckDB 中加载它:

LOAD'path/to/func_apply.duckdb_extension';

未签名扩展

要加载未签名的扩展,请使用以下方式启动 DuckDB:

duckdb-unsigned

或者在 Python 中:

con=duckdb.connect(':memory:',config={'allow_unsigned_extensions':'true'})

文档

请参阅 docs/ 文件夹获取详细文档:

  • API 参考 - 完整的函数参考
  • 示例 - 使用示例和模式
  • 内部实现 - 实现细节

许可证

MIT 许可证 - 详情请参阅 LICENSE 文件。

http://www.jsqmd.com/news/880070/

相关文章:

  • Rust内存安全特性:所有权、借用与生命周期详解
  • 无服务器架构与Serverless
  • 2026年05月河北水墨印刷开槽机厂商推荐,选型不迷茫,纸箱包装机械/水墨印刷开槽机,水墨印刷开槽机品牌推荐 - 品牌推荐师
  • DeepSeek总结的clickhousectl v0.2.0: Postgres, ClickPipes 等更多功能
  • 2026亲测:专业降AI率平台选这款就对了
  • 基于拓扑数据分析的短肽抗癌活性预测:Top-ML模型特征工程与实战
  • 复杂地理信息系统设计的数据访问层的统一抽象:PostGIS/Vector/Raster Backend模式实战
  • 告别低效写作:盘点2026年顶尖配置的的降AI率网站
  • 【具身智能】最大微信群
  • 【AI翻译避坑指南】:92%用户忽略的5个ChatGPT翻译陷阱(含术语一致性崩塌、文化错译、被动语态误判),附可直接复用的Prompt模板
  • 云安全与合规
  • Rust 异步运行时深度解析:Tokio 的原理与实践
  • Lance 写入链路:Merge Into、Compaction 与 Stable Row ID
  • 2026 四川钢板优质供应商推荐|盛世钢联全品类现货批发,价格行情与采购指南 - 四川盛世钢联营销中心
  • 2026 四川型钢优质供应商推荐|盛世钢联全品类现货批发,价格行情与采购指南 - 四川盛世钢联营销中心
  • 170家具身智能公司名单
  • 云原生应用开发
  • 登录+注册 每一分钟 最多请求5次
  • 上海空调移机维修拆装靠谱推荐、鑫诚制冷嘉一制冷本地同城移机拆装维修加氟上门服务 - 卓一科技
  • 2026深圳劳动纠纷律师推荐 本土专业靠谱律所指南 - 从来都是英雄出少年
  • 2026深圳南山劳动纠纷律师服务态度实测:耐心负责才靠谱 - 从来都是英雄出少年
  • 云网络与负载均衡
  • 通过curl命令快速测试Taotoken的API连通性与返回
  • LinkSwift网盘直链下载助手:一站式解决9大网盘下载难题
  • 江苏储能电池箱实力厂商排行 品质保障维度解析 - 奔跑123
  • 从制造名城到智造先锋:2026广州GEO优化实战企业推荐 - GEO优化
  • 江苏半导体设备外壳实力厂商排行 品质保障维度解析 - 奔跑123
  • 通过Hermes Agent对接Taotoken自定义模型提供方
  • C++ - 面向对象 - virtual、虚函数与纯虚函数
  • 江苏自动化设备外壳厂家实力排行:口碑与硬实力双维度盘点 - 奔跑123