pgrx - framework para desarrollar extensiones de PostgreSQL con Rust
(github.com/pgcentralfoundation)- 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-pgrxcargo pgrx new: crea una nueva extensióncargo pgrx init: registra y gestiona instalaciones de PostgreSQLcargo pgrx run: ejecuta y prueba la extensióncargo pgrx test: prueba en múltiples versiones de PostgreSQLcargo 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!yextension_sql_file!
- Seguridad como prioridad
panic!de Rust se traduce aERRORde 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!yelog(ERROR) - La macro
#[pg_guard]permite una integración estable entre Rust y PostgreSQL Datumde Postgres se representa comoOption<T> where T: FromDatum- Un
NULLDatum se expresa de forma segura comoOption::<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
- La anotación
- 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
Datumcon ownership dentro del contexto SPI
- Funciones avanzadas
- Acceso seguro al sistema
MemoryContextde Postgres mediantepgrx::PgMemoryContexts - Hooks de executor/planner/transaction/subtransaction
- Se puede acceder a funciones internas de PostgreSQL mediante
pgrx::pg_sysusandounsafede Rust
- Acceso seguro al sistema
- 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é.