plpython3u

PL/Python3 存储过程语言(未受信/高权限)

概览

扩展包名版本分类许可证语言
plpython3u1.0LANGPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
3290plpython3upg_catalog
3291jsonb_plpython3u-
3292ltree_plpython3u-
3293hstore_plpython3u-
相关扩展faker plv8 pllua plluau pltcl pltclu plperl plperlu
下游依赖hstore_plpython3u jsonb_plpython3u ltree_plpython3u omni_python pg4ml

版本

PG18PG17PG16PG15PG14
1.01.01.01.01.0

安装

提示:这是 PostgreSQL 内核自带的 contrib 扩展

CREATE EXTENSION plpython3u;

用法

plpython3u: PL/Python3 不受信过程语言

PL/Python3U 允许使用 Python 3 编写 PostgreSQL 函数。作为不受信语言,它可以完全访问 Python 生态系统。只有超级用户可以创建函数。

CREATE EXTENSION plpython3u;

-- 简单函数
CREATE FUNCTION py_hello(name text) RETURNS text
LANGUAGE plpython3u AS $$
  return f"Hello, {name}!"
$$;

SELECT py_hello('world');

-- 使用 Python 标准库
CREATE FUNCTION py_sha256(data text) RETURNS text
LANGUAGE plpython3u AS $$
  import hashlib
  return hashlib.sha256(data.encode()).hexdigest()
$$;

-- 返回复合类型
CREATE TYPE address AS (street text, city text, zip text);

CREATE FUNCTION parse_address(raw text) RETURNS address
LANGUAGE plpython3u AS $$
  import re
  m = re.match(r'(.+),\s*(.+)\s+(\d{5})', raw)
  if m:
    return (m.group(1), m.group(2), m.group(3))
  return None
$$;

-- 集合返回函数
CREATE FUNCTION py_generate_dates(start text, days int) RETURNS SETOF date
LANGUAGE plpython3u AS $$
  from datetime import datetime, timedelta
  d = datetime.strptime(start, '%Y-%m-%d')
  for i in range(days):
    yield (d + timedelta(days=i)).strftime('%Y-%m-%d')
$$;

-- 通过 plpy 访问数据库
CREATE FUNCTION py_row_count(table_name text) RETURNS bigint
LANGUAGE plpython3u AS $$
  result = plpy.execute(f"SELECT count(*) AS cnt FROM {table_name}")
  return result[0]['cnt']
$$;

-- 使用外部包(必须在服务器上安装)
CREATE FUNCTION py_parse_json(url text) RETURNS jsonb
LANGUAGE plpython3u AS $$
  import json, urllib.request
  response = urllib.request.urlopen(url)
  data = json.loads(response.read())
  return json.dumps(data)
$$;

最后修改 2026-03-12: update extension pages (f579993)