plRuby
PL/Ruby es un manejador de lenguaje procedimental que permite escribir funciones de base de datos en Ruby, almacenadas y ejecutadas dentro de PostgreSQL. Combina la expresividad de Ruby y su biblioteca estándar con todas las capacidades de las funciones nativas de PostgreSQL, incluyendo funciones convencionales, funciones que devuelven conjuntos de resultados, triggers, triggers de eventos y procedimientos con control de transacciones.
«`sql CREATE EXTENSION plruby;
CREATE FUNCTION hello(text) RETURNS text LANGUAGE plruby AS $$ «Hello, #{args[0]}!» $$;
SELECT hello(‘world’); — Hello, world! «`
[!NOTE] PL/Ruby integra el intérprete MRI de Ruby directamente en el backend de PostgreSQL. Es compatible con PostgreSQL 11-18 y Ruby 3.x, se instala de forma nativa mediante CREATE EXTENSION y ofrece el mismo conjunto de funcionalidades que PL/php, además de incorporar numerosas capacidades inspiradas en PL/Perl y PL/Tcl.
Características
| Escalares, arreglos, tipos compuesto | Los argumentos se reciben como valores nativos de Ruby: Integer, Float, true/false, String, Array anidados y tipos compuestos o registro como Hash. |
| Funciones que devuelven conjuntos de resultados | RETURNS SETOF / RETURNS TABLE con return_next. |
| Triggers | Triggers de registros y de sentencia mediante $_TD
|Triggers de eventos | Compatibilidad con CREATE EVENT TRIGGER mediante RETURNS event_trigger. |
|Acceso a la base de datos (SPI) | Se agregan spi_exec, spi_fetch_row, spi_processed, spi_status, spi_rewind, y los metadatos de las columnas del conjunto de resultados (spi_colnames / spi_coltypes / spi_coltypmods). |
|Procesamiento mediante cursores | spi_query (bloque o identificador), spi_fetchrow, spi_cursor_close, Cursor#each. Permite procesar grandes volúmenes de resultados sin materializarlos. |
|Sentencias preparadas | spi_prepare / spi_exec_prepared / spi_query_prepared / spi_freeplan. |
|Control de transacciones | spi_commit / spi_rollback n procedimientos, además de bloques de subtransaction. |
| Utilidades | quote_literal / quote_nullable / quote_ident, elog, compartido por sesión $_SHARED, $_SD por función. |
| Configuración de sesión | Bloques DO anónimos, carga automática de módulos mediante plruby_modules y un hook plruby.start_proc . |
| Transformaciones | jsonb_plruby, hstore_plruby, y ltree_plruby: las funciones definidas con TRANSFORM FOR TYPE permiten intercambiar estructuras nativas de Ruby como Hashes y Arrays con los tipos jsonb, hstore, y ltree. |
Consulta la referencia del lenguaje para acceder a la API completa, el cookbook para encontrar ejemplos verificados y las comparativas con PL/Perl y PL/Tcl para obtener un análisis detallado de cada funcionalidad.
Ejemplos
Una función que devuelve conjuntos de resultados
«`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) «`
Ejecución de consultas a la base de datos mediante un plan preparado
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'] $$;
Un trigger de registro que transforma datos
sql CREATE FUNCTION uppercase_name() RETURNS trigger LANGUAGE plruby AS $$ $_TD['new']['name'] = $_TD['new']['name'].upcase 'MODIFY' $$;
Requisitos
- PostgreSQL 11 o posterior (probado con las versiones 11-18; se recomienda la versión 18), con los archivos de desarrollo del servidor que incluyen pg_config.
- Ruby 3.x compilado como biblioteca compartida (ENABLE_SHARED=yes) con los encabezados de desarrollo. En Debian/Ubuntu, instalen ruby-dev.
Instalación
sh make sudo make install
A continuación, en una base de datos:
sql CREATE EXTENSION plruby;
Para más detalles, consulten el archivo INSTALL y ejecuten el conjunto de pruebas de regresión con make installcheck.
Seguridad
[!ADVERTENCIA] PL/Ruby es un lenguaje considerado no confiable. Las versiones 3.0 y posteriores de Ruby no proporcionan ningún mecanismo de aislamiento (sandbox), ya que $SAFE y la funcionalidad de marcado de objetos como contaminados fueron eliminados en Ruby 3.0. Por lo tanto, una función escrita en PL/Ruby puede realizar cualquier operación que tenga permitida la cuenta del sistema operativo que ejecuta el servidor PostgreSQL: acceder a archivos, establecer conexiones de red, ejecutar comandos del sistema, entre otras acciones.
El lenguaje se crea sin el atributo TRUSTED, lo que significa que solo los superusuarios pueden instalar la extensión o crear funciones utilizando PL/Ruby. Otorgue este privilegio únicamente a aquellos roles en los que confiaría para disponer del mismo nivel de acceso que la cuenta del sistema operativo del servidor.
Documentación
- Referencia del lenguaje
- Cookbook: implementaciones verificadas
- Pruebas de rendimiento
- Comparativa de funcionalidades: PL/Ruby vs PL/php vs PL/Perl vs PL/Tcl
- PL/Ruby vs PL/Perl
- PL/Ruby vs PL/Tcl
- Por qué PL/Ruby utiliza CRuby (MRI) en lugar de mruby
Licencia
PL/Ruby se distribuye bajo la Licencia MIT; consulte el archivo LICENSE.

