Search Shortcut cmd + k | ctrl + k
python_udf

Embedded CPython UDFs for DuckDB — py_eval, py_agg, py_scan, py_register, py_call, py_map

Maintainer(s): alitrack

Installing and Loading

INSTALL python_udf FROM community;
LOAD python_udf;

Example

LOAD python_udf;
SELECT py_eval('lambda x: x * 2 + 1', x) FROM range(10) t(x);

-- Aggregate UDF
SELECT py_agg('sum', x) FROM range(100) t(x);

-- Scan from Python
SELECT * FROM py_scan('lambda _: [{"a":1}, {"a":2}]');

-- Register persistent UDF
SELECT py_register('dbl', 'lambda x: x * 2');

-- Call registered UDF
SELECT py_call('dbl', 21);

-- Map values
SELECT py_map('ord', 'hello world');

About python_udf

CPython UDFs for DuckDB

Execute Python code directly in SQL queries with CPython embedded in DuckDB.

7 Functions:

Function Type Description
py_eval(name, arg..) Scalar Evaluate Python lambda/function per row
py_agg(name, arg) Aggregate Full-table aggregate UDF
py_scan(func) Table Generate rows from Python
py_register(name, func) Management Register a Python UDF
py_call(name, arg..) Scalar Call a registered UDF
py_map(func, arg..) Scalar Map a function over values
py_list(name) Utility List registered UDFs

Design:

  • CPython embedded via PyO3 (Rust FFI)
  • Fresh Python interpreter per DuckDB connection
  • Supports Python 3.11, 3.12, 3.13
  • macOS, Linux x64 supported

Note: Extension binary name is python_udf to avoid collision with DuckDB's core python extension. The source repository remains duckdb-python.

Added Functions

This extension does not add any functions.

Overloaded Functions

This extension does not add any function overloads.

Added Types

This extension does not add any types.

Added Settings

This extension does not add any settings.