原文:https://www.postgresql.org/about/news/plruby-3349/ 发布日期:2026-07-31 作者:Command Prompt, Inc
PL/Ruby 是一个过程语言处理器,可以让你用 Ruby 编写数据库函数,并在 PostgreSQL 内部存储和执行。它把 Ruby 及其标准库的表达力,与原生 PostgreSQL 函数的完整能力结合起来:普通函数、集合返回函数、触发器、事件触发器,以及带事务控制的过程都可以使用。
```sql CREATE EXTENSION plruby;
CREATE FUNCTION hello(text) RETURNS text LANGUAGE plruby AS $$ "Hello, #{args[0]}!" $$;
SELECT hello('world'); -- Hello, world! ```
注意:PL/Ruby 会在后端嵌入 MRI Ruby 解释器。它面向 PostgreSQL 11-18 和 Ruby 3.x,作为一等
CREATE EXTENSION安装,并提供与 PL/php 类似的功能集,同时包含大量受 PL/Perl 与 PL/Tcl 启发的能力。
Integer、Float、true / false、String、嵌套 Array,以及以 Hash 表示的复合/记录类型。return_next 的 RETURNS SETOF / RETURNS TABLE。$_TD 支持行级与语句级触发器。event_trigger 的 CREATE EVENT TRIGGER。spi_exec、spi_fetch_row、spi_processed、spi_status、spi_rewind,以及结果列元数据 spi_colnames / spi_coltypes / spi_coltypmods。spi_query(代码块或句柄)、spi_fetchrow、spi_cursor_close、Cursor#each,可在不一次性物化大结果集的情况下消费数据。spi_prepare / spi_exec_prepared / spi_query_prepared / spi_freeplan。spi_commit / spi_rollback,并支持子事务块。quote_literal / quote_nullable / quote_ident、elog、会话共享的 $_SHARED,以及每个函数自己的 $_SD。DO 块、plruby_modules 自动加载,以及 plruby.start_proc 钩子。jsonb_plruby、hstore_plruby 和 ltree_plruby 允许声明了 TRANSFORM FOR TYPE 的函数在 Ruby 原生 Hash / Array 与 jsonb、hstore、ltree 之间交换数据。完整 API 请参见语言参考;经测试的用法可以查看 cookbook;还可以参考 PL/Perl 与 PL/Tcl 的逐项功能对比。
集合返回函数:
```sql CREATE FUNCTION squares(lim integer) RETURNS TABLE(n integer, square integer) LANGUAGE plruby AS $$ (1..lim).each do |i| n = i square = i * i return_next end $$;
SELECT * FROM squares(3); -- (1,1), (2,4), (3,9) ```
使用预备计划查询数据库:
sql
CREATE FUNCTION lookup(int) RETURNS text LANGUAGE plruby AS $$
plan = spi_prepare('select name from things where id = $1', 'int4')
row = spi_fetch_row(spi_exec_prepared(plan, args[0]))
spi_freeplan(plan)
row['name']
$$;
转换数据的行级触发器:
sql
CREATE FUNCTION uppercase_name() RETURNS trigger LANGUAGE plruby AS $$
$_TD['new']['name'] = $_TD['new']['name'].upcase
'MODIFY'
$$;
pg_config 的服务器开发文件。ENABLE_SHARED=yes)及开发头文件。Debian/Ubuntu 上可安装 ruby-dev。sh
make
sudo make install
然后在数据库中执行:
sql
CREATE EXTENSION plruby;
更多细节请参见 INSTALL,并可使用 make installcheck 运行回归测试。
警告:PL/Ruby 是非受信语言。Ruby 3.0 及以后版本没有沙箱(
$SAFE和对象污染机制已在 Ruby 3.0 移除),因此 PL/Ruby 函数可以执行 PostgreSQL 服务器操作系统用户能做的任何事情:读写文件、打开网络连接、运行 shell 命令等。
该语言创建时不带 TRUSTED 属性,因此只有超级用户可以安装扩展或创建 PL/Ruby 函数。请只把这项能力授予你愿意信任其拥有服务器 OS 账号权限的角色。
PL/Ruby 使用 MIT License,详见 LICENSE。