PostgreSQL 使用 Python 和 JavaScript 编写自定义函数指南
PostgreSQL 以其卓越的可扩展性闻名,不仅支持标准 SQL 和 PL/pgSQL,还允许开发者使用 Python、JavaScript(V8)、Perl、Tcl、Java、R 等多种语言编写数据库端函数。这种能力打破了'数据库只能写 SQL'的局限,使复杂逻辑(如机器学习推理、正则处理、加密解密、API 调用)可以直接在数据库内部执行,极大提升性能与安全性。
本文将聚焦于 Python(通过 PL/Python)和 JavaScript(通过 PL/V8)两大现代语言,从环境配置、语法基础、数据类型映射、实战案例、安全限制、性能调优六大维度,详解如何在 PostgreSQL 中编写高效、安全的自定义函数。
一、为什么用外部语言写数据库函数?
1.1 核心价值
| 场景 | 优势 |
|---|---|
| 复杂计算 | 利用 NumPy/Pandas 进行向量化运算 |
| 文本处理 | 使用 Python 正则或 JS 字符串方法 |
| 机器学习 | 直接调用 scikit-learn 等模型库 |
| JSON 操作 | 原生 JSON 解析与转换更灵活 |
1.2 与 PL/pgSQL 对比
PL/pgSQL 虽然功能强大且内置优化,但在处理非结构化数据或需要第三方库支持时显得力不从心。外部语言扩展提供了更丰富的生态,但需注意跨语言调用的开销。
二、准备工作:启用语言扩展
2.1 启用 PL/Python(推荐 PL/Python3U)
默认情况下,PG 可能未安装这些扩展。你需要以超级用户身份运行以下命令:
CREATE EXTENSION IF NOT EXISTS plpythonu;
推荐使用 plpythonu(untrusted),因为它能访问文件系统并导入模块。如果是生产环境且需严格隔离,可考虑 plpython3m(trusted)。
2.2 启用 PL/V8
PL/V8 基于 V8 引擎,适合熟悉 JavaScript 的团队。
CREATE EXTENSION IF NOT EXISTS plv8;
注意:确保服务器已安装对应的 Node.js 运行时库,否则编译会失败。
三、PL/Python 详解
3.1 基础函数结构
定义一个简单的返回整数的函数:
CREATE OR REPLACE FUNCTION add_numbers(a int, b int)
RETURNS int AS $$
return a + b
$$ LANGUAGE plpythonu;
这里 $$ 是分隔符,避免内部引号冲突。实际开发中,建议将逻辑封装为类,便于维护。

