选择 打开 改范围 完整检索页

plRuby

发布于 2026-07-31,Command Prompt, Inc
相关开源软件

原文: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 启发的能力。

功能

  • 标量、数组、复合类型:参数会以 Ruby 原生值传入,包括 IntegerFloattrue / falseString、嵌套 Array,以及以 Hash 表示的复合/记录类型。
  • 集合返回函数:支持带 return_nextRETURNS SETOF / RETURNS TABLE
  • 触发器:通过 $_TD 支持行级与语句级触发器。
  • 事件触发器:支持返回 event_triggerCREATE EVENT TRIGGER
  • 数据库访问(SPI):提供 spi_execspi_fetch_rowspi_processedspi_statusspi_rewind,以及结果列元数据 spi_colnames / spi_coltypes / spi_coltypmods
  • 游标流式读取:支持 spi_query(代码块或句柄)、spi_fetchrowspi_cursor_closeCursor#each,可在不一次性物化大结果集的情况下消费数据。
  • 预备语句:支持 spi_prepare / spi_exec_prepared / spi_query_prepared / spi_freeplan
  • 事务控制:过程内可使用 spi_commit / spi_rollback,并支持子事务块。
  • 工具函数:包括 quote_literal / quote_nullable / quote_identelog、会话共享的 $_SHARED,以及每个函数自己的 $_SD
  • 会话初始化:支持匿名 DO 块、plruby_modules 自动加载,以及 plruby.start_proc 钩子。
  • 类型转换:jsonb_plrubyhstore_plrubyltree_plruby 允许声明了 TRANSFORM FOR TYPE 的函数在 Ruby 原生 Hash / Arrayjsonbhstoreltree 之间交换数据。

完整 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' $$;

要求

  • PostgreSQL 11 或更新版本(已在 11-18 上测试,推荐 18),并安装提供 pg_config 的服务器开发文件。
  • 以共享库方式构建的 Ruby 3.x(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 账号权限的角色。

文档

  • 语言参考
  • Cookbook:经过测试的配方
  • 性能基准
  • 功能对比:PL/Ruby vs PL/php vs PL/Perl vs PL/Tcl
  • PL/Ruby vs PL/Perl
  • PL/Ruby vs PL/Tcl
  • 为什么 PL/Ruby 嵌入 CRuby(MRI)而不是 mruby

许可证

PL/Ruby 使用 MIT License,详见 LICENSE。