- Permite desarrollar extensiones de PostgreSQL con Rust, procurando ser lo más idiomático y seguro posible
- Compatible con un entorno de desarrollo totalmente gestionado mediante
cargo-pgrx
cargo pgrx new: crea una nueva extensión
cargo pgrx init: registra y gestiona instalaciones de PostgreSQL
cargo pgrx run: ejecuta y prueba la extensión
cargo pgrx test: prueba en múltiples versiones de PostgreSQL
cargo pgrx package: crea un paquete de instalación de la extensión
- Soporte para múltiples versiones de PostgreSQL
- Compatible desde PostgreSQL 12 hasta 17
- Permite usar selectivamente APIs por versión mediante Rust feature gating
- Se pueden ejecutar pruebas de integración en todas las versiones
- Generación automática de esquemas
- Es posible implementar la extensión usando solo Rust
- Muchos tipos de Rust se mapean automáticamente para PostgreSQL
- El esquema SQL puede generarse automáticamente o manualmente con
cargo pgrx schema
- Se puede incluir SQL personalizado mediante las macros
extension_sql! y extension_sql_file!
- Seguridad como prioridad
panic! de Rust se traduce a ERROR de PostgreSQL, por lo que solo se aborta la transacción y no el proceso
- Mantiene el modelo de gestión de memoria de Rust, incluso en
panic! y elog(ERROR)
- La macro
#[pg_guard] permite una integración estable entre Rust y PostgreSQL
Datum de Postgres se representa como Option<T> where T: FromDatum
- Un
NULL Datum se expresa de forma segura como Option::<T>::None
- Soporte de primera clase para UDF
- La anotación
#[pg_extern] permite exponer funciones Rust (funciones definidas por el usuario de Postgres) en PostgreSQL
#[pg_trigger] permite crear funciones trigger
- Soporte para tipos definidos por el usuario
#[derive(PostgresType)] permite usar estructuras Rust como tipos de PostgreSQL:
- En memoria/en disco se codifican como CBOR, y en formato legible para humanos se representan como JSON
- Se pueden definir representaciones personalizadas para memoria/disco/JSON
#[derive(PostgresEnum)] permite usar enums de Rust como enums de PostgreSQL
- La macro
pgrx::composite_type!("Sample") permite soportar tipos compuestos
- Interfaz de programación del servidor (SPI)
- Permite acceder de forma segura a SPI
- Permite devolver de forma transparente
Datum con ownership dentro del contexto SPI
- Funciones avanzadas
- Acceso seguro al sistema
MemoryContext de Postgres mediante pgrx::PgMemoryContexts
- Hooks de executor/planner/transaction/subtransaction
- Se puede acceder a funciones internas de PostgreSQL mediante
pgrx::pg_sys usando unsafe de Rust
- Limitaciones y problemas conocidos
- Sin soporte para multithreading: Postgres es básicamente de un solo hilo, y si un hilo accede a funciones de Postgres puede provocar fallos
- Soporte asíncrono incompleto: falta investigación sobre la interacción con Postgres en contexto
async
- Soporte limitado para Windows: actualmente no funciona perfectamente en Windows
- Codificación UTF-8 obligatoria: si la base de datos Postgres no es compatible con UTF-8, pueden producirse errores
2 comentarios
Parece que pgrx cambió de nombre desde pgx.
Un proyecto similar es sqlite-loadable-rs para sqlite.
Como decía que aquí usaron pgrx en pglite-fusion - incrustar SQLite en tablas de PostgreSQL, lo busqué.