9 puntos por xguru 2024-11-20 | 2 comentarios | Compartir por WhatsApp
  • 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

 
secret3056 2024-11-20

Parece que pgrx cambió de nombre desde pgx.
Un proyecto similar es sqlite-loadable-rs para sqlite.

 
xguru 2024-11-20

Como decía que aquí usaron pgrx en pglite-fusion - incrustar SQLite en tablas de PostgreSQL, lo busqué.